顺序栈
Posted blairgrowing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序栈相关的知识,希望对你有一定的参考价值。
顺序栈
顺序栈定义
用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时
由于栈的操作的特殊性,还必须附设一个栈顶指针(top)来动态的指示栈顶元素在顺序栈中的位置。
通常以 top= -1 表示栈空。
结构体定义
struct SeqStack{ int MAXNUM; int t; DataType *element; }; typedef SeqStack* PSeqStack;
顺序栈基本运算
算法3.1 创建空栈
PSeqStack createEmptyStack_seq( void )
算法3.2 判断栈是否为空栈
int isEmptyStack_seq( PSeqStack pastack )
算法3.3 进栈
void push_seq( PSeqStack pastack, DataType x )
算法3.4 出栈
void pop_seq( PSeqStack pastack )
算法3.5 取栈顶元素
DataType top_seq( PSeqStack pastack )
顺序栈元素"入栈"
比如,还是模拟栈存储 {1,2,3,4}
的过程。最初,栈是"空栈",即数组是空的,top 值为初始值 -1,如图 1 所示:
图 1 空栈示意图
首先向栈中添加元素 1,我们默认数组下标为 0 一端表示栈底,因此,元素 1 被存储在数组 a[1] 处,同时 top 值 +1,如图 2 所示:
图2 模拟栈存储元素 1
采用以上的方式,依次存储元素 2、3 和 4,最终,top 值变为 3,如图3 所示:
图 3 模拟栈存储{1,2,3,4}
创建空栈
PSeqStack createEmptyStack(int m){ PSeqStack pstack; pstack = (PSeqStack)malloc(sizeof(SeqStack)); if (pstack!=NULL) { pstack->element=(DataType*)malloc(sizeof(DataType)*m); if (pstack->element!=NULL) { pstack->MAXNUM=m;//最大长度设置为m pstack->t=-1;//栈顶指针总是指向栈顶元素 return pstack; } else { free(pstack); } } //创建失败 cout<<"Out of space"<<endl; return NULL; }
判断栈是否为空
//判断栈是否为空 int isEmpty_stack(PSeqStack pstack){ return pstack->t==-1; }
进栈操作
void push_stack(PSeqStack pastack,DataType e){ if (pastack->t>=pastack->MAXNUM-1) { cout<<"Overflow "<<endl; }else { pastack->t=pastack->t+1;//栈顶往上移 pastack->element[pastack->t]=e;//添加元素 } }
出栈操作
其实,top 变量的设置对模拟数据的 "入栈" 操作没有实际的帮助,它是为实现数据的 "出栈" 操作做准备的。
比如,将图 5 中的元素 2 出栈,则需要先将元素 4 和元素 3 依次出栈。需要注意的是,当有数据出栈时,要将 top 做 -1 操作。因此,元素 4 和元素 3 出栈的过程分别如图 6a) 和 6b) 所示:
void pop_stack(PSeqStack pastack){ if (pastack->t==-1)//栈为空 { cout<<"not exits element"<<endl; }else { pastack->t--;//使用新元素直接覆盖原来的元素,假装其不存在 } }
获取栈顶元素
DataType get_Top(PSeqStack pastack){ if (pastack->t==-1) { cout<<"empty"<<endl; return ‘e‘; }else { return pastack->element[pastack->t]; } }
以上是关于顺序栈的主要内容,如果未能解决你的问题,请参考以下文章