1)栈的基本概念
只能从栈顶进行插入或者删除操作的线性表
2)栈的基本操作
InitStack(&S);
DestroyStack(&L);
Push(&S,x);
Pop(&S,&x);
GetTop(S,&x);
StackEmpty(S);
3)顺序栈的实现
#include <stdio.h> #define MaxSize 10 typedef struct { int data[MaxSize]; int top; }SeqStack; //初始化 void InitStack(SeqStack &S) { S.top=-1; } //栈空判断 bool StackEmpty(SeqStack S) { return(S.top==-1); } //入栈 bool Push(SeqStack &S,int x) { if(S.top==MaxSize-1) return false; S.data[++S.top]=x; return true; } //出栈 bool Pop(SeqStack &S,int &x) { if(S.top==-1) return false; x=S.data[S.top--]; return true; } //读取栈顶元素 bool GetTop(SeqStack S,int &x) { if(S.top==-1) return false; x=S.data[S.top]; return true; } //上述代码top指针初始指向栈顶 int main() { SeqStack S; InitStack(S); printf("%d\n",StackEmpty(S)); Push(S,2); printf("%d\n",StackEmpty(S)); int x; Pop(S,x); printf("%d,%d\n",StackEmpty(S),x); Push(S,3); GetTop(S,x); printf("%d,%d\n",StackEmpty(S),x); return 0; }
缺点:存储容量不可改变
4)链式栈
#include <stdio.h> #include <stdlib.h> //定义栈结点 typedef struct SNode{ int data; SNode * next; }*LinkStack,SNode; //初始化栈(不带头结点) bool InitStack(LinkStack &S) { S=NULL; return true; } //判空 bool StackEmpty(LinkStack S) { return (S==NULL); } //入栈操作 bool Push(LinkStack &S,int x) { //在头部插入元素 SNode * p=(SNode *)malloc(sizeof(SNode)); //这里并不需要区分是不是第一个结点,两者操作时一致的!!! p->data=x; p->next=S; S=p; return true; } //出栈操作(不带头结点) bool Pop(LinkStack &S,int &x) { if(S==NULL) return false; SNode * p=S; x=S->data; S=S->next; free(p); return true; } //打印栈中元素(不带头结点) void PrintStack(LinkStack S) { if(S==NULL) return; while(S!=NULL) { printf("%d ",S->data); S=S->next; } printf("\n"); } //对于链式存储结构实现的栈(不带头结点)进行增删改查操作 int main(void) { int x; LinkStack S; InitStack(S); printf("%d\n",StackEmpty(S)); Push(S,1); Push(S,2); Push(S,5); Push(S,1); PrintStack(S); Pop(S,x); Pop(S,x); PrintStack(S); return 0; }