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. idou老师教你学Istio 16:如何用 Istio 实现微服务间的访问控制

    摘要 使用 Istio 可以很方便地实现微服务间的访问控制.本文演示了使用 Denier 适配器实现拒绝访问,和 Listchecker 适配器实现黑白名单两种方法. 使用场景 有时需要对微服务间的相 ...

  2. 复杂sql书写方法

    给你一个复杂sql连接不同的表,多个嵌套查询条件等的语句时,你是非常的胆怯由于对语法的不熟悉以及没有经验和自信,现在我们来学习一下如何写复杂的sql,我们把它分解为很多小的步骤进行 一.集中最后的输出 ...

  3. spark not serializable异常分析及解决方案

    转载自: http://bigdataer.net/?p=569 1.背景 在使用spark开发分布式数据计算作业过程中或多或少会遇到如下的错误: Serialization stack: objec ...

  4. LINQ图解教程

    LINQ 什么是LINQLINQ提供程序 匿名类型 方法语法和查询语法查询变量查询表达式的结构 from子句join子句什么是联结查询主体中的from…let…where片段 from子句let子句w ...

  5. Linux下Mysql每天自动备份

    新建目录 mkdir -p /data/mysqlbal/data mkdir -p /data/mysqlbal/scripts mkdir -p /data/mysqlbal/logs 创建备份脚 ...

  6. go语言的defer语句

    转: https://www.jianshu.com/p/5b0b36f398a2 ---------------------------------------------------------- ...

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

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

  8. Shiro-Subject 分析(转)

    Subject反正就好像呈现的视图.所有Subject 都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager:可以把Subject认为是一个门面: ...

  9. 6、Spring Boot 2.x 集成 MyBatis

    1.6 Spring Boot 2.x 集成 MyBatis 简介 详细介绍如何在Spring Boot中整合MyBatis,并通过注解方式实现映射. 完整源码: 1.6.1 创建 spring-bo ...

  10. 016_编写脚本快速克隆 KVM 虚拟机

    #!/bin/bash#本脚本针对 RHEL7.2 或 Centos7.2#本脚本需要提前准备一个 qcow2 格式的虚拟机模板,名称为/var/lib/libvirt/images/.rh7_tem ...