一、栈的定义

栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表。

二、栈的基本操作

1.栈的结构体

typedef struct CharStack
{int top;int data[STACK_MAX_SIZE];
} *CharStackPtr;

2.初始化

CharStackPtr charStackInit()
{CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(struct CharStack));resultPtr->top = -1;return resultPtr;
}

3.打印

void outputStack(CharStackPtr paraStack)
{for (int i = 0; i <= paraStack->top; i ++){printf("%c ", paraStack->data[i]);}printf("\r\n");
}

4.压栈

void push(CharStackPtr paraStackPtr, int paraValue)
{// 空间检查(是否栈满)if (paraStackPtr->top >= STACK_MAX_SIZE - 1) {printf("堆栈已满,无法添加.\r\n");return;}// 顶部更新.paraStackPtr->top ++;// 入栈.paraStackPtr->data[paraStackPtr->top] = paraValue;
}

5.弹栈 

char pop(CharStackPtr paraStackPtr)
{// 空间检查(判断空栈).if (paraStackPtr->top < 0) {printf("堆栈为空,无法弹出.\r\n");return '\0';}// 顶部更新.paraStackPtr->top --;return paraStackPtr->data[paraStackPtr->top + 1];
}

6.功能测试

void pushPopTest()
{printf("栈的进出开始测试:\r\n");// 初始化CharStackPtr tempStack = charStackInit();printf("初始化后的栈: ");outputStack(tempStack);// 压栈for (char ch = 'a'; ch < 'n'; ch ++) {printf("添加 %c.\r\n", ch);push(tempStack, ch);outputStack(tempStack);}//Of for i// 弹栈for (int i = 0; i < 4; i ++) {char ch = pop(tempStack);printf("删除 %c.\r\n", ch);outputStack(tempStack);}printf("测试结束\r\n");
}

测试结果

栈的进出开始测试:
初始化后的栈:
添加 a.
a
添加 b.
a b
添加 c.
a b c
添加 d.
a b c d
添加 e.
a b c d e
添加 f.
a b c d e f
添加 g.
a b c d e f g
添加 h.
a b c d e f g h
添加 i.
a b c d e f g h i
添加 j.
a b c d e f g h i j
添加 k.
堆栈已满,无法添加.
a b c d e f g h i j
添加 l.
堆栈已满,无法添加.
a b c d e f g h i j
添加 m.
堆栈已满,无法添加.
a b c d e f g h i j
删除 j.
a b c d e f g h i
删除 i.
a b c d e f g h
删除 h.
a b c d e f g
删除 g.
a b c d e f
测试结束

三、括号匹配

 借助栈

bool bracketMatching(char* paraString, int paraLength)
{// 通过在底部压入“#”来初始化堆栈CharStackPtr tempStack = charStackInit();push(tempStack, '#');char tempChar, tempPopedChar;// 处理字符串for (int i = 0; i < paraLength; i++) {tempChar = paraString[i];switch (tempChar) {case '(':case '[':case '{':push(tempStack, tempChar);break;case ')':tempPopedChar = pop(tempStack);if (tempPopedChar != '(') {return false;}break;case ']':tempPopedChar = pop(tempStack);if (tempPopedChar != '[') {return false;}            break;case '}':tempPopedChar = pop(tempStack);if (tempPopedChar != '{') {return false;}break;default:break;}}tempPopedChar = pop(tempStack);if (tempPopedChar != '#') {return true;}return true;
}

功能测试

void bracketMatchingTest()
{printf("括号匹配测试开始:\r\n");char* tempExpression = "{6+3-[1+2*(6-2)]}/2";bool tempMatch = bracketMatching(tempExpression, 17);printf("'%s'是否括号匹配? %d \r\n", tempExpression, tempMatch);tempExpression = "[1+2*8)(]";tempMatch = bracketMatching(tempExpression, 6);printf("'%s'是否括号匹配? %d \r\n", tempExpression, tempMatch);tempExpression = "({[]})";tempMatch = bracketMatching(tempExpression, 8);printf("'%s'是否括号匹配? %d \r\n", tempExpression, tempMatch);tempExpression = "()()[]";tempMatch = bracketMatching(tempExpression, 6);printf("'%s'是否括号匹配? %d \r\n", tempExpression, tempMatch);tempExpression = "{]()";tempMatch = bracketMatching(tempExpression, 2);printf("'%s'是否括号匹配? %d \r\n", tempExpression, tempMatch);printf("测试结束\r\n");
}

测试结果

括号匹配测试开始:
'{6+3-[1+2*(6-2)]}/2'是否括号匹配? 1
'[1+2*8)(]'是否括号匹配? 1
'({[]})'是否括号匹配? 1
'()()[]'是否括号匹配? 1
'{]()'是否括号匹配? 0
测试结束

四、表达式求值

//属实是难到了,C++还有很多不理解的地方,主要还是在观摩学习,以下为学长代码,只用了两个栈便实现了表达式求值的功能。

1.#include <cstring>:可以使用很多实用的字符串函数;

2.#include<algorithm>:algorithm意为"算法",是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模版函数;

3.#include < stack > include < stack >为C++ STL栈stack的 头文件 ,是STL中实现的一个后进先出的容器:

stack<int>num//声明一个对象

str.size()//返回栈中元素个数于X

num.pop()//移除栈顶元素

num.push(x)//将X置于栈顶

op.top()//返回栈顶元素

4.unordered_map是一种关联容器,存储基于键值和映射组成的元素,即key-value。允许基于键快速查找元素。unordered_map中,键值唯一标识元素,映射的值是一个与该对象关联的内容的对象

5.auto是一个C/C++语言存储类型,仅在语句块内部使用,初始化可为任何表达式,其特点是当执行流程进入该语句块的时候初始化可为任何表达式。

//202031061018 刘知鑫
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <unordered_map>using namespace std;stack<int> num;
stack<char> op;void eval()
{auto b = num.top();num.pop();auto a = num.top();num.pop();auto c = op.top();op.pop();int x;if (c == '+') x = a + b;else if (c == '-') x = a - b;else if (c == '*') x = a * b;else x = a / b;num.push(x);
}int main()
{unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};string str;cin >> str;for (int i = 0; i < str.size(); i ++ ){auto c = str[i];if (isdigit(c)){int x = 0, j = i;while (j < str.size() && isdigit(str[j]))x = x * 10 + str[j ++ ] - '0';i = j - 1;num.push(x);}else if (c == '(') op.push(c);else if (c == ')'){while (op.top() != '(') eval();op.pop();}else{while (op.size() && op.top() != '(' && pr[op.top()] >= pr[c]) eval();op.push(c);}}while (op.size()) eval();cout << num.top() << endl;return 0;
}

数据结构-C语言代码 day6-栈及其应用相关推荐

  1. 数据结构括号匹配代码_栈:如何实现有效括号的判断?

        点击上方蓝字,关注:无量测试之道    作者 | 无量测试之道   编辑 | 小 晴有效括号,刷过LeetCode的也许对这道题很熟悉. 1.开篇问题:有效的括号[1] 假如现在要你来解这道题 ...

  2. 数据结构(C语言版)——顺序栈(代码版)

    一.代码 #include <stdio.h> #include <stdlib.h>#define MAXSIZE 10 #define OK 1 #define ERROR ...

  3. 数据结构(C语言版)——链栈(代码版)

    一.代码 #include <stdio.h> #include <stdlib.h>#define OK 1 #define ERROR 0typedef int Statu ...

  4. 数据结构(C语言版)顺序栈相关算法的代码实现

    这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...

  5. 《数据结构C语言版》——栈和队列详解(图文并茂),从零开始的学习

    哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...

  6. 《数据结构C语言版》-栈的概念和栈的实现

    目录 概念 思路和源代码 思路 源代码 头文件(主题框架) 源文件,各个接口的实现 结构体的初始化 压栈 出栈 判断是否为空 获取栈顶元素 获取元素个数 销毁 test.c源文件(main函数所在的. ...

  7. 数据结构C语言代码实战

    数据结构前言 https://blog.csdn.net/aiqq136/article/details/113721642 时间复杂度_空间复杂度 https://blog.csdn.net/aiq ...

  8. 数据结构(java语言描述)顺序栈的使用

    1.声明Istack接口: package stack; public interface Istack {     public void clear();     public boolean i ...

  9. 猴子选王c语言链表程序代码,数据结构(C语言)用栈和链表编写猴子选大王程序...

    <数据结构(C语言)用栈和链表编写猴子选大王程序>由会员分享,可在线阅读,更多相关<数据结构(C语言)用栈和链表编写猴子选大王程序(3页珍藏版)>请在人人文库网上搜索. 1.i ...

最新文章

  1. html marquee
  2. 安全性问题(数据篡改(拿到别人的URL,篡改数据(金额)发送给系统))
  3. html下拉列表插件,js+CSS实现模拟华丽的select控件下拉菜单效果
  4. CF思维联系--CodeForces -214C (拓扑排序+思维+贪心)
  5. thinkphp5 ajax搜索+分页
  6. python登录脚本_selenium+python实现自动登录脚本
  7. iQOO高层专访:打造性能旗舰 用户满意度为先
  8. 使用Python来调用电脑音响
  9. java demo类_《java语言程序设计》初步学习——各种小Demo
  10. 《中国历史2000问》读后笔记
  11. php二次开发帝国,【使用说明】帝国cms万能通用api二次开发核心包
  12. 认识MyBatis、Mybatis笔记.MyBatis的核心配置,动态Mapper,动态SQL,表的关联及分页操作和缓存理解
  13. The Little Schemer读书笔记1
  14. 快播将关闭QVOD服务器 清理低俗内容与涉盗版内容
  15. lgv20刷twrp_LG V30+ 日版 L-01K 刷机解锁BL 刷入TWR 回复日版基带
  16. 码市coding不能下载
  17. 自然语言处理nltk分词断句(2)
  18. android自定义抽奖,Android简单实现圆盘抽奖界面
  19. python库——pandas
  20. Asp.Net 上传大文件专题(4)--利用ajax技术显示上传进度

热门文章

  1. 微信小程序的后台在哪里云开发控制台操作方法
  2. Huffman文件压缩之文件夹压缩
  3. 【14】婚礼片剪辑案例【15】电视剧片头剪辑案例
  4. unity3d学习笔记-动画(1.Unity 中动画的基本原理)
  5. 找工作经历--生活的味道都在里面
  6. 自动修改hosts文件
  7. 执念斩长河专升本复习11月总结
  8. Mac 安装brew+unrar解压rar
  9. 『贪心』阿狸和桃子的游戏
  10. AcrelCloud-9500电瓶车充电桩收费平台在公共场所中的应用