目录

前言

一、顺序栈的定义

二、顺序栈的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;           }   }
} 

五、测试结果

                                          图一

图二

图三

图四

图五

图六

图七

图八

图九

图十

图十一

六、总结

栈是一种操作受限的线性表,虽然操作受限,但是与线性表有点类似,只不过栈的插入和删除都在表尾而已。而我在本文中实现的顺序栈有点类似顺序表。我们也需要注意到顺序栈虽然实现简单,但是其容易发生溢出,在栈满的时候,还要入栈,则会上溢,而在栈空的时候,还要出栈,则会下溢,针对这个问题,我将在下一篇文章的链栈解决这个问题。

顺序栈的基本操作(超详细)相关推荐

  1. java顺序栈_顺序栈的基本操作(入栈和出栈)

    顺序栈的基本操作(入栈和出栈) 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如何使用顺序 ...

  2. C语言实现顺序栈的基本操作(初始化、判断空、入栈、出栈、获取栈顶元素)

    //顺序栈的基本操作 #include<stdio.h> #define MaxSize 50 typedef int ElemType; //定义栈结构体 typedef struct ...

  3. 【C++】【数据结构】顺序栈的基本操作(初始化、入栈、出栈、取栈顶元素、遍历输出栈)的算法实现附全代码

    C++实现顺序栈的算法+步骤(附全代码): 使用c++完成数据结构顺序栈的基本操作,包括(初始化.入栈.出栈.取栈顶元素.遍历输出栈等),可直接编译运行. 顺序栈的定义如下: #define MAXS ...

  4. python 顺序栈及基本操作

    顺序栈 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如何使用顺序表模拟栈以及实现对栈中数 ...

  5. c语言顺序栈完整程序,顺序栈的基本操作(C语言)

    由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址  但是这种用法好像C并不 ...

  6. 顺序栈的基本操作c语言源代码,顺序栈的栈基本操作(C语言版)

    1 #include 2 #include 3 #define STACK_INIT_SIZE 100//储存空间初始分配量 4 #define STACKINCREMENT 10//存储空间分配增量 ...

  7. 顺序栈的基本操作(C++实现)

    栈的特点 栈是一种 " 后进先出 " 的线性表 我们用stack表示 栈,则栈顶(top),栈底(bottom) 栈的举例 例如:洗盘子,我们需要清洗一摞盘子,总是先清洗上面的然后 ...

  8. 顺序栈的基本操作 C++

    用顺序存储结构表示的栈,称为顺序栈,它用一个顺序表和栈顶指针实现. 顺序表中,用top指针指示栈顶元素在顺序栈中的位置. 当top指针与base指针指向相同位置时栈为空. #include <i ...

  9. 栈和队列(超详细Java实现)

    栈和队列 一.栈(Stack) 1.概念 2.栈的使用 3.模拟实现一个栈 1. 构造方法 2. 入栈(push) 3. 出栈(pop) 4.获取栈顶元素(peek) 5.获取元素个数(getSize ...

  10. 栈和队列相互实现 (用队列实现栈/用栈实现队列) 超详细~

    1.栈和队列的简单介绍 1.1 栈的简单介绍 栈,一种数据结构,只能从一端进出,先进后出,操作方式主要有出栈和入栈.在Java中,一般使用Stack(已不推荐)和Deque(双端队列)实现. Java ...

最新文章

  1. 基于BP神经网络+HOG特征提取的视频中车辆车牌识别算法仿真
  2. python 怎么验证是否安装成功 scrapy
  3. 学完可以解决90%以上的数据分析问题-利用python进行数据分析第二版(代码和中文笔记)...
  4. 贪心(数据结构):COGS 468. [NOI2010]超级钢琴
  5. NET Core入门笔记
  6. ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建
  7. lisp将图元追加选择_汕尾幸运儿喜爱大乐透 两次买彩票就擒获8注追加二等奖254万元...
  8. jQuery基本知识
  9. Filter过滤器的生命周期
  10. python基础语法实验报告小结_Python基础小结
  11. 队列:先进先出的线性表,如何实现增删查?
  12. 为什么电脑屏幕会横过来_笔记本电脑屏幕横过来了怎么办?笔记本电脑屏幕倒过来了恢复方法...
  13. 机器人技术创新与实践旧版本大纲
  14. 、谷歌离线地图开发教程
  15. C++封装Detours库挂钩函数
  16. swagger换新UI
  17. 揭开全景相机的创业真相
  18. 使用veil进行木马生成
  19. SSM项目使用Mybatis通用mapper插件tk.mybatis的用法
  20. 在c语言中 程序的最小编译单位是,C语言课堂练习习题集

热门文章

  1. 基于单片机的室内安全环境监测系统的设计
  2. 啦啦外卖独立版七牛云配置失败解决方案
  3. 中医meta分析,成功投稿二区期刊
  4. 微信小程序 实现城市名称拼音搜索框 汉字/拼音(城市区县定位模块)
  5. NBU查看备份集大小
  6. github上看到的springboot做的后台管理系统,bootdo,适合大家学习入门
  7. ADC和DAC中常见技术术语
  8. xmp文件格式怎么导入ps?ACR预设安装方法
  9. Java接口自动化测试框架
  10. 经典Hive-SQL面试题及答案