栈
基本概念
逻辑结构
定义
- 栈(Stack):只允许在一端进行插入或删除操作的线性表。
- 栈顶(Top):线性表允许进行插入和删除的一端。
- 栈底(Bottom):固定的,不允许进行插入和删除的一端。
- 空栈:不含任何元素的空表。
特点
后进先出(Last In First Out,LIFO)
n个元素进栈,1/(n+1)Cn-2n种出栈方式。
声明栈时分配内存,函数运行结束后系统自动回收。
基本操作
- InitStack(&S):初始化。
- StackEmpty(S):判断栈S是否为空,empty->truth。
- Push(&S,x):进栈,栈未满则加入x使之成为新栈顶。
- Pop(&S,&x):出栈,弹出栈顶元素并用x返回。
- GetTop(S,&x):获取栈顶元素,非空则用x返回。
- DestroyStack(&S):销毁栈,释放栈S占用的存储空间。
存储结构
顺序栈
-
顺序存储
-
用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时设一个指针top,指示当前栈顶的位置。
-
栈空条件、栈满条件、栈长,有无头节点
-
共享栈:两个顺序栈共享一个一维数据空间。
两个栈的栈顶指针都指向栈顶元素
top0= =-1时,0号栈为空;
top1= =Maxsize时,1号栈为空。
两个栈顶指针相邻时,(top1-top0=1)时,栈满。
//声明:懒得打了
s.data[s.top];//栈顶元素
//初始化顺序栈
void InitStack(SqStack &S){
//初始栈顶指针
S.top=-1;
//无头结点,即指针指向栈顶元素的下一个
//s.top=0;
}
//判断栈空
bool stackEmpty(SqStack S){
if(S.top==-1) //empty
return true;
else
return false; //not empty
}
//进栈
bool Push(SqStack &S,ElemType x){
if(S.top==MaxSize-1)
return false;
//指针先加1再入栈
S.data[++S.top] = x;
//无头结点
//s.data[s.top++] = x;
return true;
}
//出栈
bool StackEmpty(SqStack &S,ElemType &x){
if(S.top==-1)
return false;
//元素先出栈,指针再后移
x=S.data[S.top--];
//无头结点
//x=S.data[--S.top];
return true;
}
//读栈顶元素
bool GetTop(SqStack S,ElemType &x){
if(S.top==-1)
return false;
x=S.data[S.top];
return true;
}
链栈
- 链式存储
- 多个栈共享存储空间,提高效率
- 不存在栈满上溢
- 只能在表头进行操作
- 没有头节点,Lhead指向栈顶元素
缓冲区的上溢和下溢
上溢就是缓冲器满,还往里写;
下溢就是缓冲器空,还往外读.
数据运算
标签:,return,top,元素,栈顶,data,指针 来源: https://www.cnblogs.com/wangqr907/p/15732697.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。