数据结构—1.栈的实现

注:虽然学完了一遍栈的应用,但我还是不能给出关于栈的定义。我能理解它作为一种记录数据或者删除数据的一种操作。但是,栈解决了什么问题,有什么注意事项,还有什么高阶操作,我暂时也不会,只等后期的不断应用与思考在做总结。

一、栈的理解

  1. 栈是一种对数据进行存取或删除的操作,所以它的基本操作有3个:入栈或者压栈(push)、出栈(pop)、判断栈是否为空。栈由于特殊的结构,类似于手枪子弹夹。入栈操作即:将子弹一颗颗压入弹夹。此时有个特点,最先压入的(第一颗子弹)是最后出来的。出栈操作即:将栈顶的数据取出。判断栈是否为空,这里只需要定义一个变量记录入栈次数和出栈次数,即可判断栈是否为空。

  2. 图示:

  3. 栈的实现

    /** @name 栈的实现* @Date 2021年11月20日* @Author 机器人工程师sgk
    */#include <stdio.h>//栈,其实就是数组。所以先定义一个数组。
    char stack[100];
    int top = 0;void push(char c);
    char pop(void);
    int is_empty(void);int main(void)
    {push('a');push('b');push('c');while(!is_empty()){printf("%c\n", pop());}return 0;
    }/** @name push * @brief 将数据压入栈,来一个压一个,实际就是数组标号往后移动。* @param char 型数据* @retval None
    */
    void push(char c)
    {stack[top++] = c;//定义一个变量,表示栈顶。
    }/** @name pop* @brief 出栈,将数据弹出。* @param None* @retval char 型数据。
    */
    char pop(void)
    { return stack[--top];//调用一次,将栈顶元素弹出一个。--top
    }/** @name is_empty * @brief 判断栈是否为空。* @param None* @retval int型数据类型
    */
    int is_empty(void)
    {return top == 0;
    }

    运行结果:

    sgk@sgk-VirtualBox:~/C_Study/DataStructure$ gcc stack.c && ./a.out
    c
    b
    a
    

    结果正好体现出:栈的特点,先入后出。

    栈的应用

    1. 逆波兰表示法

      图片来自百度百科:

理解逆波兰表达式法,先理解我们平时常用的表达方式,例如:(1 + 2)* (3 - 4),这个表达式中,运算符号都在两个数之间。运算优先级可以看运算符的优先级,括号里的优先级最高。这种常用的表达式也可以称为中缀表示法。而逆波兰表达式又称为后缀表达式,上面那个例子可以写为:12+34-。拿一个稍微复杂的式子举例:5 * (((9 + 8) (4 * 6)) + 7)。

此处编程的思路:输入的是:12+34-*,当遇到数字的时候,入栈操作,当遇到符号的时候,执行出栈操作,并且将结果计算后再次进行入栈操作。直到遍历完所有字符,结束输出结果。

#include <stdio.h>
#include <string.h>int stack[512];
int top = 0;void push(int c);
int pop(void);
int is_empty(void);int main(void)
{char temp[100];//接收输入的逆波兰表达式。int i, Len;//i 用于循环控制,len用来保存输入的表达式的长度,用来控制循环。int n1, n2;printf("Please enter a reverse polish repression:\n");//打印提示信息gets(temp);//获取表达式Len = strlen(temp);//获得表达式长度printf("Len = %d\n", Len);for(i = 0; i < Len; i++){if(temp[i] >= '0' && temp[i] <= '9'){push(temp[i] - '0');printf("%d\n", temp[i] - '0');//调试时使用。}else{n2 = pop();//!!!n1 = pop();//!!!先入后出switch(temp[i]){case '+':push(n1 + n2);break;case '-':push(n1 - n2);break;case '*':push(n1 * n2);break;}}}printf("Result = %d\n", pop());return 0;
}void push(int c)
{stack[top++] = c;
}int pop(void)
{return stack[--top];
}int is_empty(void)
{return top == 0;
}

运行结果:输入 12+34-*

sgk@sgk-VirtualBox:~/C_Study/DataStructure$ gcc reverse_polish.c && ./a.out
reverse_polish.c: In function ‘main’:
reverse_polish.c:18:2: warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]gets(temp);//获取表达式^~~~fgets
/tmp/ccuIQwxK.o:在函数‘main’中:
reverse_polish.c:(.text+0x30): 警告: the `gets' function is dangerous and should not be used.
Please enter a reverse polish repression:
12+34-*
Len = 7
49
50
51
52
Result = -3

运行结果:输入 59 8+4 6**7+*

sgk@sgk-VirtualBox:~/C_Study/DataStructure$ gcc reverse_polish.c && ./a.out
reverse_polish.c: In function ‘main’:
reverse_polish.c:18:2: warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]gets(temp);//获取表达式^~~~fgets
/tmp/cc0uNjUq.o:在函数‘main’中:
reverse_polish.c:(.text+0x30): 警告: the `gets' function is dangerous and should not be used.
Please enter a reverse polish repression:
589+46**7+*
Len = 11
5
8
9
4
6
7
Result = 2075

后续继续更新。

# 数据结构---1.栈的实现相关推荐

  1. c++数据结构队列栈尸体_一本正经的聊数据结构(3):栈和队列

    前文传送门: 「一本正经的聊数据结构(1):时间复杂度」 「一本正经的聊数据结构(2):数组与向量」 引言 前一篇内容我们介绍了数组和向量,虽然说向量是数组的一个升级版,但是在另一个维度上,他们都属于 ...

  2. 数据结构:栈实现简易计算器

    文章目录 栈实现简易计算器 思路 代码实现 栈结构 运算方法 测试 栈实现简易计算器 之前的博客已经介绍了栈数据结构,栈有着数据先进后出的特点,因此用于实现简易计算器时相当方便.本博文中将介绍如何用栈 ...

  3. (三)数据结构之“栈”

    数据结构之"栈" 栈是什么 栈的应用场景 场景一:十进制转二进制 场景二:有效的括号 场景三:函数调用堆栈 JS中的函数调用堆栈 LeetCode:20.有效的括号 LeetCod ...

  4. 内存、数据结构之栈和堆的区别?

    网上有一篇很好的文章,我差不多直接搬运过来了. 来源:http://www.cleey.com/blog/single/id/776.html 原文如下: 可能很多同学在这个概念上有些模糊,其实堆栈分 ...

  5. 顺序表输入栈元素c语言,C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作 实验: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍 ...

  6. c++怎么实现数字数组的删除数字_C/C++数据结构:栈结构解析,最简单解析,让你一遍就会...

    上一章节针对于C语言最基本的数据结构链式结构体做了解析,不清楚的可以回顾一下.本章节主要针对于C语言的基础数据结构栈做以解析. 数据结构之栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅 ...

  7. Lua虚拟机中的数据结构与栈

    Lua虚拟机中的数据结构与栈 来源 https://blog.csdn.net/zry112233/article/details/80828327 由上一篇文章可知解释器分析Lua文件之后生成Pro ...

  8. 数据结构之 栈 (Python 版)

    数据结构之 栈 (Python 版) -- 利用线性表实现栈 栈的特性: 后进先出 基于顺序表实现栈 1 class SStack(): 2 3 ''' 4 基于顺序表 实现的 栈类 5 ''' 6 ...

  9. 【数据结构】栈、队列、堆的python实现

    [数据结构]栈.队列.堆的python实现 一.栈的python实现 1.1.栈的列表实现方法 1.2.用双向队列模拟栈 二.队列的python实现 2.1.队列的列表实现 2.2.使用deque实现 ...

最新文章

  1. bert速度提升fastbert
  2. Java 8新特性——default方法(defenece方法)介绍
  3. R语言ggplot2可视化分面直方图(faceting histogram)、使用gghighlight包突出高亮突出每个分面中的一个分组的直方图
  4. CrossOver 12 发布,Windows 模拟器
  5. 西瓜书+实战+吴恩达机器学习(十九)特征选择(过滤式选择、包裹式选择)
  6. 图像识别DM8127开发攻略——UBOOT的移植说明
  7. 在线qmc0转换mp3工具_音乐格式转换
  8. ESP32的SDK开发之获取SNTP网络时间
  9. 支付系统 java_PaySystem
  10. STM32F4应用-GPIO
  11. FineReport填报--批量删除
  12. 异常:java.lang.LinkageError: loader constraint violation: when resolving interface method “javax.servl
  13. html下拉 小狗,html会动的小狗狗源码
  14. 加权黑猩猩优化算法(WChOA)附Matlab代码
  15. oracle sysdate取年月日,oracle获取当前年月日时分秒季度周
  16. 日志易日志平台使用了什么开源软件
  17. 功能强大的三维动画制作软件 Autodesk 3ds Max 2012 简体中文版 + 有效激活
  18. 伺服速度控制模式接线图_伺服参数设置很重要(位置控制模式、速度控制模式、力矩控制)...
  19. 小风翻译助手v1.0.0官方版
  20. vb教材笔记_金文老师VB课程 笔记完整版.pdf

热门文章

  1. 用c语言写抽奖大转盘,iOS抽奖大转盘的二种实现方法
  2. 小米MIX进入和退出Recovery模式、Fastboot模式各种方法
  3. 绕流运动与附面层基本概念
  4. Java 对文件进行重命名操作(rename)
  5. Mars 开源月报(2020.3)
  6. 交通灯keil程序加2位数码管_51单片机红绿灯两个数码管显示实验报告
  7. 音视频入门系列-音视频基础知识篇(录播、点播、直播)
  8. 炉石传说 酒馆战棋 战斗模拟的实现
  9. apiCloud初探
  10. 在python中用于获取用户输入的是-在Python中,用于获取用户输入的函数是