动态栈的实现,括号匹配问题,逆波兰表达式
来源:互联网 发布:亲情 缺失 知乎 编辑:程序博客网 时间:2024/05/21 00:52
1.动态顺序栈的实现#include<iostream>using namespace std;template<class T>class Stack{public: Stack() :_array(new T[3]) , _size(0) , _capacity(3) {} Stack(T*array, size_t size) :_array(new T[size]) , _size(size) , _capacity(_size) { for (size_t i = 0; i<_size; i++) { _array[i] = array[i]; } } void Push(const T& data) { _CheckCapacity(); _array[_size++] = data; } void Pop() { if (_array) { _array[_size--]; } } T& Top() { if (Empty()) { cout << "栈空" << endl; exit(1); } return _array[_size-1]; } T& Top()const { { if (Empty()) { cout << "栈空" << endl; exit(1); } return _array[_size-1]; } } size_t Size()const { return _size; } bool Empty()const { return 0 == _size; } friend ostream&operator<<(ostream&os,const Stack&s) { int i = 0; for (i = 0; i < (s._size); i++) { os << s._array[i] << " "; } os << endl; return os; }private: void CheckCapacity() { if (_size >= _capacity) { int*temp = new T[(_capacity) << 1]; for (size_t i = 0; i < _size; i++) { temp[i] = _array[i]; } delete[]_array; _array = temp; _capacity = (_capacity << 1); } } T* _array; size_t _capacity; size_t _size;};int main(){ int data[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; Stack<int>s1(data,10); cout << s1 << endl; cout << s1.Top() << endl; cout << s1.Size() << endl; system("pause"); return 0;}2. 栈的应用之:括号的匹配#include <assert.h>#include <stack>bool isBrackets(char l)//判断括号{ if (l == '('|| l == ')' || l == '{' || l == '}' || l =='[' || l == ']') { return true; } return false;}bool MatchBrackets(char* pStr){ stack<char>s; assert(pStr); size_t len = strlen(pStr); for (size_t 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 0; } else if (s.top() == '(' && pStr[i] == ')'|| s.top() == '[' && pStr[i] == ']'|| s.top() == '{' && pStr[i] == '}')//匹配成功,出栈 { s.pop(); } else { cout << "左右括号次序不匹配" << endl; return 0; } } } } if (!s.empty())//若还不为空则说明左括号多于右括号 { cout << "左括号多于右括号" << endl; return 0; } else { return true; }}void test(){ char a[] = "(())abc{[(])}"; char b[] = "(()))abc{[]}"; char c[] = "(()()abc{[]}"; char d[] = "(())abc{[]()}"; MatchBrackets(a); MatchBrackets(b); MatchBrackets(c); MatchBrackets(d);}int main(){ test(); system("pause"); return 0;}3. 栈的应用之:计算后缀表达式#include<iostream> #include<stack>using namespace std;enum Type{ OP_SYMBOL, //符号,记录传进来的操作符 OP_NUM, //操作数 操作符 ADD, SUB, MUL, DIV,};struct Cell{ Type _type; //每个传进来的单元的类型 int _value; //是操作数,就是数值 };int CountRPN(Cell* rpn, size_t n){ stack<int> s; for (size_t i = 0; i<n; i++) { 先判断传进来的是操作符还是操作数 是操作数压栈 if (OP_NUM == rpn[i]._type) { s.push(rpn[i]._value); } 是操作符出栈 if (OP_SYMBOL == rpn[i]._type) { int right = s.top(); s.pop(); int left = s.top(); s.pop(); 是操作符,就进行四则运算 switch (rpn[i]._value) { case 2: s.push(left + right); break; case 3: s.push(left - right); break; case 4: s.push(right*left); break; case 5: if (right == 0) //我们在这块可以抛异常 { throw std::invalid_argument("参数错误!"); } s.push(left / right); break; default: throw std::invalid_argument("参数异常"); break; } } } return s.top();}void TestRPN(){ //原来的式子是:12-3*4-5+2 = -3 转换成后缀表达式:12 3 4 * -5 -2+ Cell rpn[] = { { OP_NUM, 12 }, { OP_NUM, 3 }, { OP_NUM, 4 }, { OP_SYMBOL, MUL }, { OP_SYMBOL, SUB }, { OP_NUM, 5 }, { OP_SYMBOL, SUB }, { OP_NUM, 2 }, { OP_SYMBOL, ADD }, }; try { cout << CountRPN(rpn, sizeof(rpn) / sizeof(rpn[0])) << endl; } catch (exception&e) //捕获异常 { e.what(); cout << "err" << endl; }}int main(){ TestRPN(); system("pause"); return 0;}
阅读全文
0 0
- 动态栈的实现,括号匹配问题,逆波兰表达式
- 栈的应用(括号匹配、逆波兰表达式)
- 【数据结构】动态栈+括号匹配+逆波兰表达式(后缀表达式计算)
- C++括号匹配问题与逆波兰表达式
- 利用栈解决括号匹配和逆波兰表达式
- 括号匹配检测 逆波兰表达式
- 栈及栈的应用(括号匹配和逆波兰表达式)
- 逆波兰式实现四则运算表达式计算器支持括号、十六进制
- [栈的应用]动态顺序栈的实现、逆波兰表达式
- 括号匹配问题--栈实现
- 求解逆波兰表达式 除了括号都可用的
- C++实现算术表达式的括号匹配
- 一个动态的栈实现的括号匹配程序
- C++实现 逆波兰表达式计算问题
- 逆波兰表达式问题
- 逆波兰表达式实现
- 栈的实现-括号匹配
- 逆波兰表达式的计算问题
- webIx之表单提交
- python3中的np.load编码问题
- HDU1511 Air Raid(二分图,最小路径覆盖)
- 干货 |《深入理解Elasticsearch》读书笔记
- 1067. 试密码(20)
- 动态栈的实现,括号匹配问题,逆波兰表达式
- 1146 面向对象程序设计上机练习七(类和对象)
- Hibernate框架连接SQL sever 2016完整详细步骤
- JVM实用参数(四)内存调优
- VB中的“msgbox”函数各参数详解
- angularjs自定义过滤器
- 模拟实现strcmp函数
- JAVA 四大域对象总结
- 打开SQL Developer时,提示缺少快捷方式