顺序栈-初始化栈顶指针为-1

  • 1.头文件及类型定义
  • 2.顺序栈类型定义
  • 3.函数声明
  • 4.基本操作
    • 4.1 初始化顺序栈
    • 4.2 判空
    • 4.3 入栈
    • 4.4 出栈
    • 4.5 读取栈顶元素
    • 4.6 main函数
  • 5.小结

1.头文件及类型定义

#include<stdio.h>
#define MaxSize 10          //定义顺序栈中元素的最大个数
#define ElemType int

2.顺序栈类型定义

typedef struct {     ElemType data[MaxSize];     //静态数组存放栈中元素int top;                    //栈顶指针,一般来说存放数组的下标
}SeqStack;

3.函数声明

/*函数声明*/
void InitStack(SeqStack& S);                //1.初始化顺序栈
bool StackEmpty(SeqStack S);                //2.判空
bool Push(SeqStack& S, ElemType x);         //3.入栈
bool Pop(SeqStack& S, ElemType& x);         //4.出栈
bool GetTop(SeqStack S, ElemType& x);       //5.读取栈顶元素

4.基本操作

4.1 初始化顺序栈

//1.初始化栈
void InitStack(SeqStack& S) {S.top = -1;       //初始化栈顶指针为-1
}

4.2 判空

//2.判空
bool StackEmpty(SeqStack S) {return (S.top == -1);
}

4.3 入栈

//3.入栈操作:新元素入栈(先加再存)
bool Push(SeqStack& S, ElemType x) {if (S.top == MaxSize - 1)     //栈满,报错return false;S.top++;       //栈顶指针先加1S.data[S.top] = x;    //新元素再入栈:在栈顶指针所指位置放入x/*以上两句与此句等价:S.data[++S.top] = x;请注意是++S.top,而不是S.top++*/return true;
}

4.4 出栈

//4.出栈操作:栈顶元素出栈(先取再减)-栈顶元素只是逻辑上被删除了,实际上还残留在内存中
bool Pop(SeqStack& S, ElemType &x) {if (S.top == -1)      //栈空,报错return false;x = S.data[S.top];      //栈顶元素先出栈:返回栈顶元素的值xS.top--;              //指针指针再减1/*以上两句与此句等价:x = S.data[S.top--];请注意是S.top--,而不是--S.top,注意与上面的入栈操作对比*/return true;
}

4.5 读取栈顶元素

//5.读取栈顶元素操作
bool GetTop(SeqStack S, ElemType &x) {if (S.top == -1)        //栈空,报错return false;x = S.data[S.top];      //与出栈操作唯一的区别:仅返回栈顶元素,栈顶指针并不减1return true;
}

4.6 main函数

int main() {SeqStack S;      //声明一个顺序栈(分配内存空间)/*1、初始化栈*/InitStack(S);    /*2、判空*/if (StackEmpty(S))printf("当前栈空!\n");elseprintf("当前栈非空!\n");/*3、入栈操作*/ElemType e1;printf("请输入入栈元素的值:");scanf("%d", &e1);if (Push(S, e1))printf("新元素入栈成功!\n");elseprintf("栈已满,新元素入栈失败!\n");/*4、读取栈顶元素*/ElemType e2 = -1;if (GetTop(S, e2))printf("读取栈顶元素成功,当前栈顶元素值为:%d\n", e2);elseprintf("栈已空,读取栈顶元素失败!\n");/*5、出栈操作*/ElemType e3 = -1;if (Pop(S, e3))printf("栈顶元素出栈成功,出栈元素值为:%d\n", e3);elseprintf("栈已空,栈顶元素出栈失败!\n");/*6、读取栈顶元素*/ElemType e4 = -1;if (GetTop(S, e4))printf("读取栈顶元素成功,当前栈顶元素值为:%d\n", e4);elseprintf("栈已空,读取栈顶元素失败!\n");return 0;
}

5.小结

  1. 栈的定义及操作特性
    (1)栈的本质仍然为线性表,只不过是一种操作受限的线性表,只允许在一端进行插入或者删除操作。同线性表类似,它也有两种存储方式:顺序存储和链式存储,将在接下来的文章中继续讨论。
    (2)栈的操作特性为后进先出(LIFO,Last In First Out)
  2. 栈的基本操作
    因为操作受限,所以栈的操作相比于线性表来说也少一点,常用如下:
    (1)初始化
    (2)判空
    (3)入栈
    (4)出栈
    (5)获取栈顶元素
  3. 说明
    本文先介绍栈的顺序存储,即顺序栈。由于顺序栈是由数组实现的,所以在操作时要注意数组下标和和栈顶指针的关系,。另外,注意i++(先用再加)和++i(先加再用)的区别。

【数据结构】-顺序栈(初始化栈顶指针为-1)相关推荐

  1. 【数据结构】-顺序栈(初始化栈顶指针为0)

    顺序栈-初始化栈顶指针为0 1.头文件及类型定义 2.顺序栈类型定义 3.函数声明 4.基本操作 4.1 初始化顺序栈 4.2 判空 4.3 入栈 4.4 出栈 4.5 读取栈顶元素 4.6 main ...

  2. 【数据结构】栈详解——压栈/入栈 | 弹栈/出栈 | 获取栈顶元素

    栈 顺序栈 栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈, ...

  3. 顺序栈—栈顶指针的两种初始化

    采用顺序存储的栈称之为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针指示当前栈顶元素的位置. 下面给出两种栈顶指针定义的方式,讨论两种方式中在出栈.入栈代码上的不同: ...

  4. 顺序栈(含有栈顶指针,栈底指针)的实现以及编写过程中的一些疑惑的解决

    参考文献:数据结构(c语言版)---严蔚敏p44----->p47 代码如下: #include<stdlib.h>//malloc realloc #include<iost ...

  5. 顺序栈栈顶指针指向详析

    顺序栈栈顶指针指向详析 1.变长型(动态分配内存空间) #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 // 存储空 ...

  6. 【数据结构】共享栈详解 判断共享栈满条件栈顶指针变化详解记忆方法例题

    摘要:简单易懂,详细地介绍共享栈概念,指针,判断共享栈栈满条件以及记忆方法等 目录 共享栈概念 栈顶指针&变化详解 栈顶指针种类的记忆方法 判断栈满条件 判断栈满条件的记忆方法 例题 解题思路 ...

  7. 数据结构栈的操作,初始化栈,进栈,出栈,读取栈顶元素;

    代码段: #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h ...

  8. C语言 数据结构 顺序栈的实现 进栈 出栈 初始化

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.代码实现 前言 顺序栈是栈的顺序实现.顺序栈是指利用顺序存储结构实现的栈.采用地址连续的存储空间(数组)依次存储栈 ...

  9. 数据结构 :: 顺序栈与链式栈的设计与实现

    数据结构 :: 双链表的设计与实现 说明:本文属于读书笔记.笔者将以讲述的方式表达全片文章.故文中提到的某些字词是非正式术语,只是笔者本人的理解性词语. 前言:本文将对顺序栈与链式栈进行设计与实现!其 ...

最新文章

  1. Apache启动时报Could not reliably determine the server's fully qualified domain name
  2. 全球股市巨震,如何用深度学习预测股价?
  3. PTA数组作业一查找整数
  4. smarty去除html标签,Smarty与脚本中的html标签爆裂
  5. mysql查询的时候会涉及到锁_Mysql 查询 锁的问题?
  6. Python map/reduce
  7. CVPR 2020丨8比特数值也能训练模型?商汤提出训练加速新算法
  8. 如何使用可控硅?(详细教程)
  9. 《Algorithms》Comparable 实现排序大全
  10. 谷歌邮箱lmap服务器填什么_常用邮箱SMTP服务器设置
  11. linux sybase 自动备份,sybase数据库 Linux环境下,每天定时全量备份+sybase数据库 stripe on 还原...
  12. 商业数据库之死:Oracle 的困境
  13. (混沌序列统计特性)离散傅里叶测试---matlab
  14. Exchange的邮箱创建与使用
  15. 知己知彼,案例对比 Requests、Selenium、Scrapy 爬虫库!
  16. 企业上云要几步?中拓互联奉送企业上云全攻略
  17. 四步快速配置一个简单高效的文本生成图像基准模型 T2I baseline
  18. AT指令(中文详解版)(二)
  19. 【Python】文件选择框选择文件
  20. 一种控制方法并发的注解方法,@Ylock

热门文章

  1. Gradient_patch_recovery, Z_Z posteriori error estimator
  2. word参考文献交叉引用一次性更新全部域
  3. 初次爬虫:读取PDF转成图片,再提取图片里的文字信息
  4. 论文投稿指南——中文核心期刊推荐(航空、航天)
  5. 浅述容器和容器镜像的区别
  6. UVa 12195 - Jingle Composing
  7. 如何才能够系统地学习Java并发技术?
  8. 无限法则服务器错误代码,电脑打个无限法则没事儿重启,看系统管理器。提示如图错误代码,发现看不懂...
  9. bash:/home/xxxx/catikin_ws/setup.bash:没有那个文件或者目录
  10. hessian矩阵特征值