1 栈
从数据结构角度来讲,栈也是线性表,其操作是线性表操作的子集,属操作受限的线性表。
但从数据类型的角度看,它们是和线性表大不相同的重要抽象数据类型。
◆ 栈是只准在一端进行插入和删除操作的线性表,该端称为栈的顶端。
栈顶(
Top
):线性表允许插入和删除的一端
栈底(Bottom
):固定的,不允许进行插入和删除的一端
2 栈的基本操作
从栈顶删除最后一个元素的操作,称为出栈。
插入元素到栈顶的操作,称为入栈。
对于向上生成的堆栈:
入栈口诀:堆栈指针
top
“先压后加” :S[top++]=x
出栈口诀:堆栈指针top
“先减后弹” :e=S[--top]
top==-1
为空则栈空
top==maxsize-1
为真则栈满
3 顺序栈代码实现
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE (20)typedef int ElementType;
typedef struct SqStack {ElementType data[MAXSIZE];int top;
} *Stack;Stack InitStack(void) //初始化栈
{Stack s = (Stack)malloc(sizeof(struct SqStack));s->top = -1;return s;
}void Push(Stack s, ElementType e) //压栈,将元素e插入到栈S中,作为S的新栈顶
{if (s->top == MAXSIZE - 1) { //栈满return;}s->top++;s->data[s->top] = e;
}void Pop(Stack s, ElementType *e) //出栈,若栈S不为空,则删除栈顶元素
{if (s->top == -1) { //栈空return;}*e = s->data[s->top];s->top--;
}void PrtStack(Stack s)
{for (int i = 0; i <= s->top; i++) {printf("%d ", s->data[i]);}printf("\n");
}int main(void)
{ElementType e;Stack s = InitStack();PrtStack(s);printf("please input a element :");scanf("%d", &e);Push(s, e);PrtStack(s);Pop(s, &e);printf("Pop a element : %d", e);return 0;
}