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

  • 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 = 0;        //初始化栈顶指针为0
}

4.2 判空

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

4.3 入栈

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

4.4 出栈

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

4.5 读取栈顶元素

//5.读取栈顶元素操作
bool GetTop(SeqStack& S, ElemType& x) {if (S.top == 0)        //栈空,报错return false;x = S.data[--S.top];    S.top++;  //若SeqStack不是引用类型,则此句不用加//以上两句代码建议画图,与初始化指针为-1的顺序栈有所区别return 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和0的区别
    在遇到相关问题时,一定要注意看清初始化栈顶指针的值。
    (1)当初始化为-1时,栈顶指针指向的是当前栈中的实际位置,而当初始化为为0时,栈顶指针指向的是下一次要插入的位置。
    (2)在进行入栈和出栈的操作时,二者核心操作是相反的。
    (3)在获取栈顶元素的操作中,如果初始化栈顶为0,那么需要先对指针减1才能取到栈顶元素的值,这点与初始化栈顶为-1时的操作有所不同。并且,如果函数定义中参数使用了引用传递,那么栈顶指针还需要再加1,保持栈顶指针原来的位置。如果使用值传递,则不需要,因为值传递不会改变原来的栈。
  2. 顺序栈的缺点
    顺序栈是由静态数组实现的,和顺序表一样,它也存在着容量不可改变的缺点,如果刚开始申请的内存空间过大,又存在内存浪费的问题。
    如何解决这个问题呢,一种是仍然使用顺序存储,使用共享栈来提高内存空间的利用率;另一种则是使用链式存储,引入链栈,这两种方式将在接下来的文章中继续讨论。

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

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

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

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

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

  3. BJFU_数据结构习题_241双栈的基本操作

    欢迎登录北京林业大学OJ系统 http://www.bjfuacm.com 241双栈的基本操作 描述 将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端.当第0号栈的栈顶指针 ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 美国政府突然宣布放弃对 DNS 根区的控制
  2. redhat-problem to be research
  3. XML文档类型定义DTD
  4. C++输入函数的应用
  5. 无线多串口服务器,多串口通信服务器
  6. Python分析pdf简历
  7. 手机可以使用鸿蒙系统,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  8. C++内存机制中内存溢出、内存泄露、内存越界和栈溢出的区别和联系
  9. [leetcode]529. 扫雷游戏 DFS递归、BFS、DFS栈实现
  10. UVA 10602 - Editor Nottoobad
  11. ALtera DE2开发板学习04
  12. pyqt:使用qrc文件配置图片资源,生成py文件
  13. 谷歌浏览器flash插件设置
  14. 个人计算机系统的不稳定原因,cpu使用率忽高忽低怎么办 电脑cpu使用率不稳定原因分析【详解】...
  15. 从NLP任务中文本向量的降维问题,引出LSH(Locality Sensitive Hash 局部敏感哈希)算法及其思想的讨论...
  16. Mac解决Error: No such file or directory @ rb_sysopen报错问题
  17. 论计算机维护论文,论计算机装与维护毕业论文.docx
  18. 前端开发必备(三)-----用js验证表单是否为空以及验证码是否输入正确
  19. 【四二学堂】H5手机游戏-梅花易数一撮金(游戏开发系列微课之一)
  20. 说说数据结构中的几种树

热门文章

  1. 一元多项式的加法详解
  2. codeforces #309 div2
  3. Three.js实现的网站页面金字塔模型显示
  4. SEO的工作内容是什么?
  5. twisted中的延迟(deferred)(一)
  6. MySQL数据表插入数据及增加语句
  7. 【C 语言之项目实战】生成随机数并排序(详细版)
  8. separator path php,php常量 DIRECTORY_SEPARATOR 和 PATH_SEPARATOR
  9. mysql怎么输出列表的次序_MySQL metalock的一些技巧(写大于读的案例,以及获得锁的顺序)...
  10. Windows下VMware准备IOS开发环境