栈及栈的应用(括号匹配和逆波兰表达式)
来源:互联网 发布:电脑桌面工作提醒软件 编辑:程序博客网 时间:2024/06/14 02:42
栈的概念:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作。
栈顶:进行数据插入和删除的一端。
栈底:栈顶的另一端。
空栈:不含任何元素的栈。
栈的性质:先进后出
栈的功能:从某种数据元素序列到另一种数据元素序列的改变。
栈的实现:
#include<iostream>using namespace std;#include<assert.h>template<class T>class Stack{public:Stack()//构造函数:_a(NULL), _size(0), _capacity(0){}~Stack()//析构函数{if (_a){delete[] _a;_capacity = _size = 0;}}void Push(const T &s)//插入{Checkcapacity();_a[_size++] = s;}void Pop()//删除{assert(_size > 0);--_size;}bool empty()//判空{return _size == 0;}size_t Size()//元素个数{return _size;}T& Top()//输出栈顶元素{assert(_size > 0);return _a[_size - 1];}void Checkcapacity(){if (_size >= _capacity){_capacity = _capacity == 0 ? 3 : _capacity * 2;T* tmp = new T[_capacity];for (size_t i = 0; i < _size; ++i){tmp[i] = _a[i];}delete[] _a;_a = tmp;}}private:T* _a;size_t _size;size_t _capacity;};void test(){Stack<int> s;s.Push(1);s.Push(2);s.Push(3);s.Push(4);while (!s.empty()){cout << s.Top() << endl;s.Pop();}cout << endl;}int main(){test();system("pause");return 0;}运行结果:
自己实现的与库函数的对比:
栈的应用一:括号匹配问题
1、括号匹配的情况:
(1)右括号多于左括号
(2)左右括号次序匹配不正确
(3)左括号多于右括号
(4)左右括号匹配正确
2、实现思想:定义一个栈,遇到左括号入栈,遇到右括号时,令栈顶的左括号与右括号进行匹配
当栈为空,右括号多于左括号
当字符串遍历结束之后,栈不为空,左括号多与有括号
当栈顶的左括号与右括号不匹配时,次序不匹配
当字符串遍历结束之后,栈为空,匹配正确
#include<iostream>using namespace std;#include<assert.h>#include<stack>stack<char> s;bool IsBrackets(char e)//判断字符是否为空{if (e == '(' || e == ')' || e == '[' || e == ']' || e == '{' || e == '}')return true;return false;}bool MatchBrackets(char * pStr){assert(pStr);int len = strlen(pStr);for (int i = 0; i < len; i++){if (!IsBrackets(pStr[i]))//不是括号continue;else{if (pStr[i] == '(' || pStr[i] == '[' || pStr[i] == '{')//左括号入栈s.push(pStr[i]);else//右括号{if (s.empty())//栈顶为空{cout << "右括号多于左括号" << endl;return false;}char c = s.top();if (c == '(' && c == ')' || c == '[' && c == ']' || c == '{' && c == '}')s.pop();else{cout << "右左括号次序匹配不正确" << endl;return false;}}}}if (!s.empty()){cout << "左括号多于右括号" << endl;return false;}cout << "左右括号匹配正确" << endl;return true;}int main(){char str[100];cin >> str;MatchBrackets(str);system("pause");return 0;}
运行结果:
运算时,第一次出栈的数是右操作数,第二次出栈的是左操作数
阅读全文
0 0
- 栈及栈的应用(括号匹配和逆波兰表达式)
- 栈的应用(括号匹配、逆波兰表达式)
- 利用栈解决括号匹配和逆波兰表达式
- 动态栈的实现,括号匹配问题,逆波兰表达式
- 【数据结构】动态栈+括号匹配+逆波兰表达式(后缀表达式计算)
- 括号匹配检测 逆波兰表达式
- 波兰表达式和逆波兰表达式(栈)
- 数据结构 栈的应用 逆波兰表达式
- 栈的应用:逆波兰表达式
- 栈的应用—逆波兰表达式
- 栈的应用:逆波兰表达式求值
- 栈的应用--逆波兰表达式
- 栈(经典应用逆波兰表达式)
- 数据结构-栈的应用-算术表达式小括号匹配
- 栈的应用Ⅰ--后缀表达式 括号匹配
- 2. 栈的两个应用:括号匹配和表达式的计算。
- C++括号匹配问题与逆波兰表达式
- 括号匹配(一) 栈的应用
- 【ZJOI2008】树的统计(LCT)做法
- 扫雷
- 兄弟连学Python(1)———python经典小程序
- stm32_007_stm32f103和atmega128进行对比
- CDN远程库
- 栈及栈的应用(括号匹配和逆波兰表达式)
- python学习笔记 第十二章
- Sublime Text 3 Build 3155 & 3156 License
- Class.forName()用法详解
- ngx-bootstrap学习笔记(一)-popover
- 二叉树--uva122 结构体+指针解法
- log4j
- 个人简介
- Effective STL学习笔记-条款44