0 栈的基本概念

栈,根据存储结构的不同,可分为:链栈和顺序栈。

1 顺序栈的知识概览

2 编程复现

2.1 定义基本数据结构

typedef char DataType; // 基本数据类型

enum Status { ERROR, OK, OVERFLOW };// 状态(码) : 枚举类型

#define MAXSIZE_STACK 100 //栈内最大元素数

typedef struct { // 顺序栈

DataType *base; // 栈底指针 (NULL:栈结构不存在;【重点】 初始化后,始终指向栈底)

DataType *top; //栈顶指针 【重点】(初始时:top==base; top所指处无任何元素)

int stackSize; //栈可用的最大容量

}SeqStack;

2.2 基本操作

Status InitStack(SeqStack &S); //初始化

Status Push(SeqStack &S, DataType e); //入栈

Status Pop(SeqStack &S, DataType &e); //出栈

bool StackEmpty(SeqStack S); //判定栈空

bool StackFull(SeqStack S); //判定栈满

Status GetTop(SeqStack S, DataType &e); //取得栈顶元素

int StackLength(SeqStack &S); //栈的长度

Status StackTraverse(SeqStack S); //栈的遍历

0> 初始化

Status InitStack(SeqStack &S){

S.base = new DataType [MAXSIZE_STACK];

if(S.base==NULL){

exit(OVERFLOW);

}

S.top = S.base;

S.stackSize = MAXSIZE_STACK; // 设置栈的可用最大容量

return OK;

}

1> 入栈

Status Push(SeqStack &S, DataType e){//入栈

if(S.top - S.base == S.stackSize){ // 栈满

return ERROR;

}

*S.top = e;

S.top++;

StackTraverse(S);

return OK;

}

2> 出栈

Status Pop(SeqStack &S, DataType &e){//出栈

if(S.top==S.base){//栈空

return ERROR;

}

e = *(S.top-1); //返回栈顶元素的值 【易错】top所指处系栈顶元素的后一位,而非直接指向栈顶元素

S.top--; //【易混】要么,是先自减1,再取栈顶元素(*(S.top-1)),最后降top的位置(top--);要么,先自降top位置(top-1),再直接取当前栈顶top位置的元素(即 S.top即为栈顶元素真值)

return OK;

}

3> 判定栈空

bool StackEmpty(SeqStack S){ // 栈空?

if(S.base==S.top){ // 栈空

return true;

}

return false; //栈不为空

}

3> 判定栈满

bool StackFull(SeqStack S){ //栈满?

if(S.top-S.base == S.stackSize){

return true;//栈满

}

return false; //栈未满

}

4> 取栈顶元素

Status GetTop(SeqStack S, DataType &e){//取栈顶元素

if(S.top==S.base){//栈空

return ERROR;

}

e = *(S.top-1); //【易错】

return OK;

}

5> 栈的长度

int StackLength(SeqStack &S){

if(S.base==NULL){

return -1;

}

return S.top-S.base;

}

6> 栈的遍历

Status StackTraverse(SeqStack S){//遍历

if(S.base == NULL){ // 栈结构不存在

return ERROR;

}

if(S.base == S.top){//栈空

return ERROR;

}

DataType *p = S.top;

while(p!=S.base){

cout<

p--;

}

cout<

return OK;

}

7> 执行:Main函数

#include

#include

#include"base.h" // 引入 基本数据类型 以及 表函数处理结果的状态码结构体 Status

#include // main函数中需要测试调用 (string类)

using namespace std;

int main(){

SeqStack S;

InitStack(S);

string instruction="-"; // string 在 cmd | 标准I/O 模式中输入时,将会以空格隔断字符串

DataType data;

cout<

cout

while(instruction!= "#"){

cout<

cin>>instruction;

if(instruction=="PUSH"){

if(!StackFull(S)){

cout<

cin>>data;

//cout<

Push(S, data);

} else {

cout<"<

}

} else if(instruction=="POP"){

Status status = Pop(S, data);

if(status==OK){

cout<

} else {

cout<"<

}

} else {

cout<"<

}

cout<

}

StackTraverse(S);

return 0;

}

8> Output For Test

Please Input Your Instructions:

[INSTRUCTION]PUSH

[PUSH DATA]8

(length:1)

[INSTRUCTION]PUSH

[PUSH DATA]7

(length:2)

[INSTRUCTION]PUSH

[PUSH DATA]3

(length:3)

[INSTRUCTION]PUSH

[PUSH DATA]1

(length:4)

[INSTRUCTION]PUSH

[PUSH DATA]K

(length:5)

[INSTRUCTION]PUSH

[PUSH DATA]M

(length:6)

[INSTRUCTION]POP

[POP DATA]M

(length:5)

[INSTRUCTION]%

(length:5)

[INSTRUCTION]#

(length:5)

M KM 1KM 31KM 731KM 8731KM

参考文献

《数据结构(C语言版 / 严蔚敏 李冬梅 吴伟民 编)》

数据结构遍历顺序栈_[C++]数据结构:栈之顺序栈相关推荐

  1. java集合框架栈_自己实现集合框架(九):栈接口

    这是系列文章,每篇文章末尾均附有源代码地址.目的是通过模拟集合框架的简单实现,从而对常用的数据结构和java集合有个大概的了解.当然实现没有java集合的实现那么复杂,功能也没有那么强大,但是可以通过 ...

  2. arm64入栈出栈_使用 ARM64 汇编实现共享栈式协程

    # 简述 大约在半年以前,我曾经了解过协程的相关实现,也看过腾讯后台开源的协程库`libco`,对其中实现协程相关的汇编有很深的印象(`libco`适配的是 x86 平台).接受了这样的思想,我在自己 ...

  3. 数据结构树的基本操作_《数据结构》树的基本操作.doc

    <数据结构>树的基本操作 实验四 课程名称:完成日期:姓名:学号:指导教师:实验名称:实验序号:实验成绩:一.实验目的及要求 二.实验环境.实验内容 求出它的深度. .调试过程及实验结果 ...

  4. 微信小程序页面栈_微信小程序使用页面栈改变上一页面的数据

    微信小程序中如果从一个页面中进入下一个页面,如果下个页面的数据有删除或者增加再返回上一个页面的时候,就会导致页面不刷新(数据加载函数在onload中),从而造成数据不一致的情况.其实在微信小程序中是可 ...

  5. 数据结构python吕云翔_《数据结构》吕云翔编著第1章绪论习题解答

    数据结构第一章绪论习题 一. [单选题] 1. ( A )是数据的基本单位. A.数据元素 B.数据对象 C.数据项 D.数据结构 2. ( C )是数据的不可分割的最小单位. A.数据元素 B.数据 ...

  6. 汇编自动出栈_汇编自学 (12) 重温进出栈指令PUSH POP 和双循环

    微软的masm5.0是8位平台的,6.0是16位平台的,还有其他32位平台的.现在编程一般用32位平台,8位和16位都可以在保护模式运行. 最简单的一个程序 assume cs: codesg cod ...

  7. javascript 全栈_什么是JavaScript? 全栈编程语言

    javascript 全栈 JavaScript是一种流行的解释性脚本语言,在2019年初成为开发人员最常学习的语言 . JavaScript是一种开放标准,不受任何单一供应商的控制,具有多种实现方式 ...

  8. java数据结构博客园_常见数据结构的Java实现

    单链表的Java实现 首先参考wiki上的单链表说明,单链表每个节点包含数据和指向链表中下一个节点的指针或引用.然后看代码 import java.lang.*; public class Singl ...

  9. 合并的数组会有顺序么_咱就别按顺序刷题了,看看大佬怎么刷

    1. 碎碎念 今天完成了体育测试,大学生活真的就快要将近了,未来什么时候还能和这些可爱的同学们聚一聚呢?祝大家都好吧!比较让我高兴的是,公众号终于有了一个粉丝,哈哈哈,非常感谢关注哇!每天都要好好敲代 ...

  10. java三个线程 顺序执行_如何确保三个线程顺序执行

    三个线程t1.t2.t3.确保三个线程,t1执行完后t2执行,t2执行完后t3执行. 一.使用join thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. ...

最新文章

  1. 强势推荐一位 Python 原创自动化大佬!
  2. 幽门螺杆菌感染会增加代谢综合征和糖尿病风险,竟然“男女有别”?
  3. MySQL之SQL优化详解(二)
  4. Memcache存储大数据的问题(大于1m)
  5. EntityFramework 学习: Console中初见
  6. HDU 1520 Anniversary party(树形dp)
  7. 数据结构与算法--数组:二维数组中查找
  8. 2020牛客暑期多校训练营(第四场)
  9. 【LeetCode】【HOT】301. 删除无效的括号(递归)
  10. ES6新特性_ES6中模块暴露数据语法汇总---JavaScript_ECMAScript_ES6-ES11新特性工作笔记043
  11. 获取实体类属性值为null的属性名
  12. 特斯拉全自动驾驶硬件发布!马斯克明年推RoboTaxi:傻瓜才用激光雷达
  13. mapxtreme2008 7.0错误
  14. 云优CMS插件不需要云优CMS授权码的插件
  15. 小程序 微信统计表格_用微信快速收集自定义报名统计,这款小程序做到了
  16. c语言频谱图,c-实时绘制频谱图?
  17. shel文件生成和执行
  18. [Unity3D]Unity3D官方案例SpaceShooter开发教程
  19. 2021年茶艺师(初级)模拟考试及茶艺师(初级)实操考试视频
  20. Python之Excel图片处理(将excel chart另存为图片)

热门文章

  1. 奔图打印机显示未连接_奔图打印机常见故障及解决方法
  2. 【20保研】厦门大学信息学院2019年全国优秀大学生暑期夏令营招生简章
  3. Python数据结构与算法视频教程-王宁宁-专题视频课程
  4. rapidminer java,rapidminer 数据导入及几个算子简单应用
  5. Unity3D Editor Undo回退效果实现3 Odin相关
  6. SQL Server 2017 安装AdventureWorks示例数据库出现的问题
  7. win7我的计算机无法搜索,win7搜索功能无法正常使用的有效解决方法
  8. android电容触摸屏的驱动及其上层工作原理,电容触摸屏驱动原理
  9. 世界三大统计分析软件sas splus spss
  10. 计算机硬件故障的相关知识,电脑常见硬件故障大全