栈和队列实质上是俩种受限制的线性表
一 栈的定义:
栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。
(1)通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。
(2)当表中没有元素时称为空栈。
(3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表。
栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除。
二 栈的顺序存储结构
实质上是运算受限的线性表
(1)顺序栈的类型定义
- #define StackSize 100//假定预先分配100元素
- typedef char DataType;//假定栈元素的数据类型为字符
- typedef struct
- {
- DataType data[StackSize];
- int top;
- }SeqStack;
- 注:top用来指示当前栈顶的位置,因为在栈低是不变的
- 三 顺序栈的基本操作
- 规定: S是SeqStack类型指针,s->data[0]为栈底元素
- (1)进栈操作
- 进栈时,需要将S->top加1
- ①S->top==StackSize-1表示栈满
- ②"上溢"现象--当栈满时,再做进栈运算产生空间溢出的现象。
- (2)出栈操作
- 退栈时,需将S->top减1
- ①S->top<0表示空栈
- ②"下溢"现象——当栈空时,做退栈运算产生的溢出现象。
- 置栈空
- void InitStack(SeqStack *S)
- {//将顺序栈置空
- S->top=-1;
- }
- 判栈空
- int StackEmpty(SeqStack *S)
- {
- return S->top==-1;
- }
- 判栈满
- int StackFull(SeqStack *S)
- {
- return S->top==StackSize-1;
- }
- 进栈
- void Push(SeqStack *S,int x)
- {
- if (StackFull(S))
- printf("Stack overflow"); //上溢,退出运行
- S->data[++S->top]=x;//栈顶指针加1后将x入栈
- }
- 退栈
- DataType Pop(SeqStack *S)
- {
- if(StackEmpty(S))
- {
- printf("Stack underflow"); //下溢,退出运行
- exit(0);
- }
- return S->data[S->top--];//栈顶元素返回后将栈顶指针减1
- }
- 取栈顶元素
- DataType StackTop(SeqStack *S)
- {
- if(StackEmpty(S))
- {
- printf("Stack is empty");
- exit(0);
- }
- return S->data[S->top];
- }
转载:http://blog.csdn.net/xsf50717/article/details/39934051