顺序栈的基本操作(超详细)
目录
前言
一、顺序栈的定义
二、顺序栈的c++语言结构描述表示
三、顺序栈中基本操作的实现
3.1顺序栈的初始化
3.2判断顺序栈是否为空
3.3求顺序栈的长度
3.4清空顺序栈
3.5销毁顺序栈
3.6顺序栈的入栈
3.7顺序栈的出栈
3.8求栈顶元素
3.9遍历顺序栈
四、顺序栈的代码实现
五、测试结果
五、总结
前言
本文参考王卓老师的数据结构视频和严蔚敏老师的《数据结构》
一、顺序栈的定义
栈:操作受限的线性表,限定仅在表尾进行插入和删除操作的线性表,即后进先出。这一端被称为栈顶,相对地,把另一端称为栈底。
顺序栈:用顺序结构存储的栈
例子:类似子弹压入弹夹,后放入的子弹可以先从弹夹弹出来。
特点:简单方便,但是容易溢出(上溢或者下溢)
二、顺序栈的c++语言结构描述表示
代码如下(示例):
typedef struct sqstack{
int *top;//栈顶指针
int *base;//栈底指针
int stackSize;//栈的最大容量
}stack;
三、顺序栈中基本操作的实现
3.1顺序栈的初始化
数组用c++的new来动态开辟
当内存不够的时候,也即是s.base为空,则直接结束
不为空的时候,则栈的栈顶指针与栈底指针都指向同一位置
代码如下(示例):
void initStack(stack &s)
{s.base=new int[MaxSize];if(!s.base) exit(0);//内存分配失败,结束s.top=s.base;//初始的时候栈的top与base相等 s.stackSize=MaxSize;//栈的最大容量
}
3.2判断顺序栈是否为空
栈顶指针与栈底指针都指向同一位置,即s.base==s.top的时候,则栈为空,返回1
否则,不为空,返回0
代码如下(示例):
int isEmpty(stack s)
{if(s.base==s.top)return 1;//表示为空,无元素return 0;//不为空
}
3.3求顺序栈的长度
长度即为有多少个元素,可以用s.top-s.base
代码如下(示例):
int stackLength(stack s)
{return s.top-s.base;
}
3.4清空顺序栈
当s.base不为空的时候,让s.top(栈顶指针)直接指向s.base(栈底),则把所有的元素逻辑上清空了
而当s.base为空的时候,则栈已经被销毁了,无需清空
代码如下(示例):
void CleanStack(stack &s)
{if(s.base){s.top=s.base;cout<<"成功清空"<<endl;}elsecout<<"栈已经被销毁,无需清空"<<endl;
}
3.5销毁顺序栈
从物理层次销毁
也即是用delete将整个s.base从内存中删除
代码如下(示例):
void DestoryStack(stack &s)
{if(s.base){delete s.base;s.stackSize=0;s.base=NULL;s.top=NULL;cout<<"成功销毁"<<endl;}elsecout<<"栈已经被销毁,无需销毁"<<endl;
}
3.6顺序栈的入栈
首先判断栈是否已经满了,如果满了则无法入栈,否则可以入栈
代码如下(示例):
void push(stack &s,int e)
{if((s.top-s.base)==s.stackSize)cout<<"栈满了,无法添加新元素"<<endl;else{*(s.top)=e;s.top++; cout<<"添加成功"<<endl;}
}
3.7顺序栈的出栈
首先判断栈是否为空,如果为空,则无法出栈,否则可以出栈
代码如下(示例):
void pop(stack &s,int &e)
{if(isEmpty(s)){cout<<"栈为空,无法弹出"<<endl;} else{s.top--;e=*(s.top);cout<<"成功弹出"<<endl; }
}
3.8求栈顶元素
先判断栈是否为空,为空则无法求栈顶元素,否则可以求栈顶元素
代码如下(示例):
int top(stack s)
{if(isEmpty(s)){cout<<"栈为空,没有栈顶元素"<<endl;return -1;}else{s.top--;return *(s.top);}
}
3.9遍历顺序栈
从栈底开始遍历
代码如下(示例):
void traverse(stack s)
{int length=stackLength(s);if(length>0){cout<<"顺序栈的元素为:(从栈底开始遍历)"<<endl;for(int i=0;i<length;i++)cout<<s.base[i]<<" ";} elsecout<<"顺序栈为空"<<endl;
}
四、顺序栈的代码实现
#include <iostream>
using namespace std;
const int MaxSize=100;
typedef struct sqstack{int *top;//栈顶指针int *base;//栈底指针int stackSize;//栈的最大容量
}stack;
void initStack(stack &s)
{s.base=new int[MaxSize];if(!s.base) exit(0);//内存分配失败,结束s.top=s.base;//初始的时候栈的top与base相等 s.stackSize=MaxSize;//栈的最大容量
}
int isEmpty(stack s)
{if(s.base==s.top)return 1;//表示为空,无元素return 0;//不为空
}
int stackLength(stack s)
{return s.top-s.base;
}
void CleanStack(stack &s)
{if(s.base){s.top=s.base;cout<<"成功清空"<<endl;}elsecout<<"栈已经被销毁,无需清空"<<endl;
}
void DestoryStack(stack &s)
{if(s.base){delete s.base;s.stackSize=0;s.base=NULL;s.top=NULL;cout<<"成功销毁"<<endl;}elsecout<<"栈已经被销毁,无需销毁"<<endl;
}
//入栈
void push(stack &s,int e)
{if((s.top-s.base)==s.stackSize)cout<<"栈满了,无法添加新元素"<<endl;else{*(s.top)=e;s.top++; cout<<"添加成功"<<endl;}
}
//出栈
void pop(stack &s,int &e)
{if(isEmpty(s)){cout<<"栈为空,无法弹出"<<endl;} else{s.top--;e=*(s.top);cout<<"成功弹出"<<endl; }
}
int top(stack s)
{if(isEmpty(s)){cout<<"栈为空,没有栈顶元素"<<endl;return -1;}else{s.top--;return *(s.top);}
}
void traverse(stack s)
{int length=stackLength(s);if(length>0){cout<<"顺序栈的元素为:(从栈底开始遍历)"<<endl;for(int i=0;i<length;i++)cout<<s.base[i]<<" ";} elsecout<<"顺序栈为空"<<endl;
}
void menu()
{cout<<"**********************************"<<endl;cout<<"1.初始化"<<endl;cout<<"2.判断栈是否为空"<<endl;cout<<"3.求栈的长度"<<endl;cout<<"4.清空栈"<<endl;cout<<"5.销毁栈"<<endl;cout<<"6.入栈"<<endl;cout<<"7.出栈"<<endl;cout<<"8.求栈顶元素"<<endl;cout<<"9.遍历顺序栈"<<endl;cout<<"10.退出"<<endl;cout<<"**********************************"<<endl;
}
int main()
{int choice;stack s;int e1,e2;while(1){menu();cin>>choice;switch(choice){case 1:initStack(s);cout<<"初始化成功"<<endl;break;case 2:if(isEmpty(s))cout<<"栈为空"<<endl;elsecout<<"栈不为空"<<endl; break;case 3:cout<<"栈的长度为"<<stackLength(s)<<endl;break;case 4:CleanStack(s);break;case 5:DestoryStack(s);break; case 6:cout<<"请输入想要入栈的元素值:"<<endl;cin>>e1;push(s,e1);break;case 7:pop(s,e2);cout<<"弹出的元素为"<<e2<<endl;break;case 8:if(top(s)!=-1)cout<<"栈顶元素为"<<top(s)<<endl;break;case 9:traverse(s);cout<<endl;break;case 10:cout<<"成功退出"<<endl;exit(0);default:cout<<"输入有误,请重新输入"<<endl;break; } }
}
五、测试结果
图一
图二
图三
图四
图五
图六
图七
图八
图九
图十
图十一
六、总结
栈是一种操作受限的线性表,虽然操作受限,但是与线性表有点类似,只不过栈的插入和删除都在表尾而已。而我在本文中实现的顺序栈有点类似顺序表。我们也需要注意到顺序栈虽然实现简单,但是其容易发生溢出,在栈满的时候,还要入栈,则会上溢,而在栈空的时候,还要出栈,则会下溢,针对这个问题,我将在下一篇文章的链栈解决这个问题。
顺序栈的基本操作(超详细)相关推荐
- java顺序栈_顺序栈的基本操作(入栈和出栈)
顺序栈的基本操作(入栈和出栈) 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如何使用顺序 ...
- C语言实现顺序栈的基本操作(初始化、判断空、入栈、出栈、获取栈顶元素)
//顺序栈的基本操作 #include<stdio.h> #define MaxSize 50 typedef int ElemType; //定义栈结构体 typedef struct ...
- 【C++】【数据结构】顺序栈的基本操作(初始化、入栈、出栈、取栈顶元素、遍历输出栈)的算法实现附全代码
C++实现顺序栈的算法+步骤(附全代码): 使用c++完成数据结构顺序栈的基本操作,包括(初始化.入栈.出栈.取栈顶元素.遍历输出栈等),可直接编译运行. 顺序栈的定义如下: #define MAXS ...
- python 顺序栈及基本操作
顺序栈 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如何使用顺序表模拟栈以及实现对栈中数 ...
- c语言顺序栈完整程序,顺序栈的基本操作(C语言)
由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址 但是这种用法好像C并不 ...
- 顺序栈的基本操作c语言源代码,顺序栈的栈基本操作(C语言版)
1 #include 2 #include 3 #define STACK_INIT_SIZE 100//储存空间初始分配量 4 #define STACKINCREMENT 10//存储空间分配增量 ...
- 顺序栈的基本操作(C++实现)
栈的特点 栈是一种 " 后进先出 " 的线性表 我们用stack表示 栈,则栈顶(top),栈底(bottom) 栈的举例 例如:洗盘子,我们需要清洗一摞盘子,总是先清洗上面的然后 ...
- 顺序栈的基本操作 C++
用顺序存储结构表示的栈,称为顺序栈,它用一个顺序表和栈顶指针实现. 顺序表中,用top指针指示栈顶元素在顺序栈中的位置. 当top指针与base指针指向相同位置时栈为空. #include <i ...
- 栈和队列(超详细Java实现)
栈和队列 一.栈(Stack) 1.概念 2.栈的使用 3.模拟实现一个栈 1. 构造方法 2. 入栈(push) 3. 出栈(pop) 4.获取栈顶元素(peek) 5.获取元素个数(getSize ...
- 栈和队列相互实现 (用队列实现栈/用栈实现队列) 超详细~
1.栈和队列的简单介绍 1.1 栈的简单介绍 栈,一种数据结构,只能从一端进出,先进后出,操作方式主要有出栈和入栈.在Java中,一般使用Stack(已不推荐)和Deque(双端队列)实现. Java ...
最新文章
- 基于BP神经网络+HOG特征提取的视频中车辆车牌识别算法仿真
- python 怎么验证是否安装成功 scrapy
- 学完可以解决90%以上的数据分析问题-利用python进行数据分析第二版(代码和中文笔记)...
- 贪心(数据结构):COGS 468. [NOI2010]超级钢琴
- NET Core入门笔记
- ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建
- lisp将图元追加选择_汕尾幸运儿喜爱大乐透 两次买彩票就擒获8注追加二等奖254万元...
- jQuery基本知识
- Filter过滤器的生命周期
- python基础语法实验报告小结_Python基础小结
- 队列:先进先出的线性表,如何实现增删查?
- 为什么电脑屏幕会横过来_笔记本电脑屏幕横过来了怎么办?笔记本电脑屏幕倒过来了恢复方法...
- 机器人技术创新与实践旧版本大纲
- 、谷歌离线地图开发教程
- C++封装Detours库挂钩函数
- swagger换新UI
- 揭开全景相机的创业真相
- 使用veil进行木马生成
- SSM项目使用Mybatis通用mapper插件tk.mybatis的用法
- 在c语言中 程序的最小编译单位是,C语言课堂练习习题集