数据结构与算法3—栈
1. 栈的定义
- 栈,也叫堆栈,是最常用也是最重要的数据结构之一。
- 栈(Stack)是限定仅在表的一端进行插入或删除操作的线性表,通常称插入、删除的这一端为栈顶(Top),另一端为栈底(Bottom)。当表中没有元素时称为空栈。
- 栈操作的特点:后进先出,先进后出。
- 因此,栈称为后进先出表(LIFO, Last In First Out)。
示意图:
2. 栈的基本运算
- 初始化栈InitStack(*S)
- 压栈Push(*S,x) ——在栈顶插入元素
- 出栈Pop(*S,x) ——在栈顶删除元素
- 取栈顶元素GetTop(S,x)
- 判栈空Empty(S)
栈的几种状态(最大长度MaxSize为4):栈空、压栈、栈满、出栈
3. 栈的存储结构
栈有两种表示方法:顺序存储和链式存储
3.1 顺序栈
采用顺序存储结构的栈简称为顺序栈。是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设整型变量top指示栈顶元素在顺序栈中的位置。
// 顺序栈数据类型的C语言描述如下: #define MaxSize 100 typedef int DataType; typedef struct { DataType data[MaxSize]; int top; }Stack; // top:栈顶指针。取值范围为0~MaxSize-1。 // top==-1表示栈空,top==MaxSize-1表示栈满。
// 初始化栈InitStack(S) int InitStack(Stack *S) { S->top=-1; return 1; } // 压栈Push(S,x) int Push(Stack *S,DataType x) { if(S->top==MaxSize-1) { printf("\n Stack is full!"); return 0; } S->top++; S->data[S->top]=x; return 1; } // 判栈空EmptyStack(S) int EmptyStack(Stack *S) { return (S->top==-1?1:0); } // 出栈Pop(S,x) int Pop(Stack *S,DataType *x) { if(EmptyStack(S)) { printf("\n Stack is free!"); return 0; } *x=S->data[S->top];//记住要删除的元素值 S->top--; return 1; } // 取栈顶元素GetTopStack(S) DataType GetTop(STACK *S) { DataType x; if(EmptyStack(S)) { printf("\n Stack is free!"); exit(1); } x=S->data[S->top]; return x; }
3.1 链栈:栈的链式存储结构
链栈结构示意图:
top栈顶指针,惟一的确定一个链栈。 链栈通常带有一个表头结点,所以top->next才指示栈顶元素。
// 链栈的C语言描述如下:
typedef struct node { ElemType data; struct node *next; }Stack;
Stack * InitStack() { Stack *top; top=(Stack *)malloc(sizeof(Stack)); top->next=NULL; return top; } //进栈 int Push(Stack *top,Pos x) { Stack *s; s=(Stack *)malloc(sizeof(Stack)); if(!s) //当s==NULL return 0 return 0; s->data=x; s->next=top->next; //新申请空间的指针域保存上一个结点的地址 top->next=s; //头指针域保存新结点地址 return 1; } //判断栈空 int EmptyStack(Stack *top) { if(top->next==NULL) return 1; else return 0; } //出栈 int Pop(Stack *top,Pos *e) { Stack *s; if(EmptyStack(top)) return 0; s=top->next; //取第一个结点的地址 *e=s->data; //返第一结点数据 top->next=s->next; //头结点指针域存第二结点地址 free(s); return 1; } //取栈顶元素 int GetTopStack(Stack *top,Pos *e) { Stack *s; if(EmptyStack(top)) return 0; s=top->next; *e=s->data; return 1; }