栈:是限定仅在表尾进行插入和删除操作的线性表。(又称“后进先出”线性表) 栈顶:允许插入和删除的一端。 栈底:另一端。 空栈:不含任何数据元素的栈。
顺序存储结构:
栈的定义 typedef int SElemType; typedef struct { SElemType data[MAXSIZE]; int top; /*用于栈顶指针*/ }sqstack; 创建空栈 /*创建栈*/ sqstack *sqstack_create( ) { sqstack *S; S=(sqstack *)malloc(sizeof(*S)); S->top=-1; return S; } 进栈 int push(sqstack *S,SElemType e) { if(S->top==MAXSIZE-1) /*栈满*/ { return -1; } S->top++; /*栈顶指针+1*/ S->data[S->top]=e; /*将新插入元素赋给栈顶空间*/ return 0; } 出栈 int pop(sqstack *S,SElemType *e) { if(S->top==-1) { return -1; } *e=S->data[S->top]; /*用e返回其将要删除的栈顶元素*/ S->top--; return 0; /*栈顶指针-1*/ }链式存储结构:
链栈的定义 typedef struct StackNode { SElemType data; struct StackNode *next; }StackNode,*LinkStackPtr; typedef struct LinkStack { LinkStackptr top; int count; }LinkStack; 创建空栈 int InitStack(LInkStack *S) { S=(LinkStack *)malloc(sizeof(LinkStack)); S->top=NULL; S->count=0; } 进栈 int push(LinkStack * ,S,SElemType e) { LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode)); s->data=e; s->next=S->top; S->top=s; S->count++; return 0; } 出栈 int pop(LinkStack *S,SElemType *e) { LinkStackPtr p; if(StackEmpty(*S)) return -1; *e=S->top->data; p=S->top; S->top=S->top->next; free(p); S->count--; return 0; }