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<<"\t";
p--;
}
cout<<p<<endl;
return OK;
}
  • 7> 执行:Main函数
#include<stdio.h>
#include<iostream> #include"base.h" // 引入 基本数据类型 以及 表函数处理结果的状态码结构体 Status
#include<string> // main函数中需要测试调用 (string类) using namespace std; int main(){
SeqStack S;
InitStack(S);
string instruction="-"; // string 在 cmd | 标准I/O 模式中输入时,将会以空格隔断字符串
DataType data;
cout<<"Please Input Your Instructions:"<<endl;
cout<"Format: \n1.\"#\":Stop Execute.\n2.\"PUSH\" 'H':Push a element 'H'. 3.\"POP\" 'T':Pop a element 'T'.\n";
while(instruction!= "#"){
cout<<"[INSTRUCTION]";
cin>>instruction;
if(instruction=="PUSH"){
if(!StackFull(S)){
cout<<"[PUSH DATA]";
cin>>data;
//cout<<"(data:"<<data<<")\n"; //for test
Push(S, data);
} else {
cout<<"<ERROR: Stack is full!So, it doesn't allow 'PUSH' operation!>"<<endl;
}
} else if(instruction=="POP"){
Status status = Pop(S, data);
if(status==OK){
cout<<"[POP DATA]"<<data<<endl;
} else {
cout<<"<ERROR: 'POP' operation handle error!>"<<endl;
}
} else {
cout<<"<ERROR: INSTRUCTION is error!)>"<<endl;
}
cout<<"(length:"<<StackLength(S)<<")\n";// for test
}
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]%
<ERROR: INSTRUCTION is error!)>
(length:5)
[INSTRUCTION]#
<ERROR: INSTRUCTION is error!)>
(length:5)
M KM 1KM 31KM 731KM 8731KM

参考文献

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

[C++]数据结构:栈之顺序栈的更多相关文章

  1. C++栈学习——顺序栈和链栈的差别

    C++中栈有顺序栈和链栈之分.在顺序栈中,定义了栈的栈底指针(存储空间首地址base).栈顶指针top以及顺序存储空间的大小stacksize(个人感觉这个数据成员是能够不用定义的) //顺序栈数据结 ...

  2. 数据结构:C_顺序栈的实现

    数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typede ...

  3. TOJ 数据结构实验--静态顺序栈

    描述 创建一个顺序栈(静态),栈大小为5.能够完成栈的初始化.入栈.出栈.获取栈顶元素.销毁栈等操作. 顺序栈类型定义如下: typedef struct {  int data[Max];    i ...

  4. 数据结构——Java实现顺序栈

    一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 顺序栈是指利用顺序存储结构实现 ...

  5. TZOJ 数据结构实验--静态顺序栈

    描述 创建一个顺序栈(静态),栈大小为5.能够完成栈的初始化.入栈.出栈.获取栈顶元素.销毁栈等操作. 顺序栈类型定义如下: typedef struct {  int data[Max];    i ...

  6. 栈(顺序栈)----C语言

    栈 栈是一种运算受限的线性表,是一种先进后出的数据结构,限定只能在一端进行插入和删除操作,允许操作的一端称为栈顶,不允许操作的称为栈底 顺序栈(顺序结构) 顺序栈:用一段连续的存储空间来存储栈中的数据 ...

  7. Java栈之顺序栈存储结构实现

    一.栈的基本定义 栈是一种数据结构,它代表一种特殊的线性表,这种线性表只能在固定一端(通常认为是线性表的尾端)进行插入.删除操作的特殊线性表,通常就是在线性表的尾端进行插入.删除操作. 二.顺序栈的实 ...

  8. 数据结构 - 顺序栈的实行(C语言)

    数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪 ...

  9. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

随机推荐

  1. linux getpid _getpid()

    getpid是一种函数,功能是取得进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题. 函数功能:取得进程识别码 相关函数:fork,kill,getpid 头文件:旧版本 ...

  2. 大数据之路week02 Collection 集合体系收尾(Set)

    1.Set集合(理解) (1)Set集合的特点 无序,唯一. (2)HashSet集合(掌握) A: 底层数据结构是哈希表(是一个元素为链表的数组) B: 哈希表底层依赖两个方法: hashCode( ...

  3. Css案例整理

    1.实现两个div并排显示 案例:checkbox的标题和内容需要并排显示,checkbox竖向排列 <head> <style type="text/css"& ...

  4. c#winform多线程感想

    我很菜所以好好学!!! 最近在做一个关于识别的项目,手动识别和自动识别,为了更好的保证自动识别不会引起界面的卡顿等现象,所以简单的学习了一下多线程,也只是入门但还是记录一下. 一.首先了解一下用多线程 ...

  5. 2019牛客多校第四场A meeting——树的直径

    题意: 一颗 $n$ 个节点的树上标有 $k$ 个点,找一点使得到 $k$ 个关键结点的最大距离最小. 分析: 问题等价于求树的直径,最小距离即为直径除2向上取整. 有两种求法,一是动态规划,对于每个 ...

  6. Linux C打印所有的环境变量

    #include <stdio.h> extern char** environ; int main() { ; ; environ[nIndex] != NULL; nIndex++) ...

  7. Maven+Docker 部署

    Maven+Docker 部署 安装jdk8镜像 docker pull openjdk:8-jdk-alpine maven插件推送方式 修改/etc/docker/daemon.json文件,加入 ...

  8. Linux 安装python3.7

    首先需要安装依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-dev ...

  9. P1772 [ZJOI2006]物流运输 最短路+DP

    思路:最短路+DP 提交:1次 题解: $f[i]$表示到第$i$天的最小代价,我们可以预先处理出$i,j$两天之间(包括$i,j$)都可通行的最短路的代价记做$s[i][j]$,然后有$f[i]=m ...

  10. 003转载----C#打开网页

    作者:微wx笑 来源:CSDN 原文:https://blog.csdn.net/testcs_dn/article/details/42246969 版权声明:本文为博主原创文章,转载请附上博文链接 ...