【数据结构】动态栈+括号匹配+逆波兰表达式(后缀表达式计算)
2017-11-20 00:35
525 查看
#define _CRT_SECURE_NO_WARNINGS #include<iostream>//动态栈的简单实现 #include<assert.h> #define DEFAULTSIZE 3 using namespace std; template<class T> class Stack { public: Stack() :_array(NULL) , _size(0) , _capacity(0) { } void Push(const T& data) { CheckCapacity(); _array[_size] = data; _size++; } void Pop() { if (_size == 0) { cout << "已经为空不能弹出数据" << endl; return; } _size--; } T& Top() { return _array[_size-1]; } T& Top()const { return _array[_size-1]; } size_t Size()const { return _size; } bool Empty()const { return 0 == _size; } void DisPlay() { for (size_t i = 0; i < _size; i++) { cout << _array[i] <<" "; } cout << endl; } private: void CheckCapacity() { if (_size == _capacity) { int *p = new int[_size+DEFAULTSIZE]; for (size_t i = 0; i < _size; i++) { p[i] = _array[i]; } delete[] _array; _array = p; _capacity = _size + DEFAULTSIZE; } } T* _array; size_t _capacity; size_t _size; }; void FunTest() { Stack<int> s; s.Push(0); s.Push(1); s.Push(2); s.Push(3); s.Push(4); s.DisPlay(); cout << s.Top() << endl; s.Pop(); s.DisPlay(); s.Pop(); s.DisPlay(); cout << s.Top() << endl; cout << s.Size() << endl; cout << s.Empty() << endl; s.Pop(); cout << s.Empty() << endl; s.Pop(); cout << s.Empty() << endl; s.Pop(); cout << s.Empty() << endl; s.Pop(); } #include<iostream>//括号匹配 #include<assert.h> #include<stack> using namespace std; bool IsMatch(char c) { if (c == '('||c == ')' || c == '{'|| c == '}' || c == '['||c == ']') return true; return false; } bool MatchBrackets(char* pStr) { assert(pStr); stack <char> s; int len = strlen(pStr); for (int i = 0; i < len; ++i) { if (!IsMatch(pStr[i])) continue; if (pStr[i] == '(' || pStr[i] == '{' || pStr[i] == '[' ) { s.push(pStr[i]); } else { if (s.empty()) { cout << "右括号比左括号多" << endl; return false; } else { char c = s.top(); if (pStr[i] == ')'&&c == '(' || pStr[i] == '}'&&c == '{' || pStr[i] == ']'&&c == '[') { s.pop(); } else { cout << "左括号次序匹配错误" << endl; return false; } } } } if (s.empty()) { cout << "括号匹配正确" << endl; return true; } else { cout << "左括号比右括号多" << endl; return false; } } void FunTest2() { char a[] = "(())abc{[(])}"; // 左右括号次序匹配不正确 char b[] = "(()))abc{[]}"; // 右括号多于左括号 char c[] = "(()()abc{[]}"; // 左括号多于右括号 char d[] = "(())abc{[]()}"; // 左右括号匹配正确 MatchBrackets(a); MatchBrackets(b); MatchBrackets(c); MatchBrackets(d); } int main() { FunTest2(); system("pause"); return 0; } #include<iostream>//逆波兰表达式(后缀表达式) #include<stack> #include<assert.h> using namespace std; enum OPERATOR{ ADD, SUB, MUL, DIV, DATA }; struct Cell { OPERATOR _op; int _data; }; int CalRPN(Cell * RPN, int size) { stack<int> s; for (int i = 0; i < size; i++) { if (DATA == RPN[i]._op) { s.push(RPN[i]._data); } else { int right = s.top(); s.pop(); int left = s.top(); s.pop(); switch (RPN[i]._op) { case ADD: s.push(left + right); break; case SUB: s.push(left - right); break; case MUL: s.push(left * right); break; case DIV: if (0==right) { cout << "除数为零" << endl; } s.push(left / right); break; default: assert(0); break; } } } return s.top(); } int main() { Cell RPN[] = { { DATA, 2 }, { DATA, 3 }, { DATA, 4 }, { ADD, 0 }, { MUL, 2 }, { DATA, 6 }, { SUB, 0 }, { DATA, 8 }, { DATA, 2 }, { DIV, 0 }, { ADD, 2 } }; cout << CalRPN(RPN, sizeof(RPN) / sizeof(RPN[0])) << endl; system("pause"); return 0; }
相关文章推荐
- 栈的应用----括号匹配、逆波兰表达式【数据结构】
- 数据结构-------计算逆波兰表达式(后缀表达式)
- 逆波兰式(后缀表达式)的运用-计算四则表达式并用lex,Yacc拓展
- 利用栈解决括号匹配和逆波兰表达式
- 逆波兰表达式(后缀表达式)及其计算
- 栈及栈的应用(括号匹配和逆波兰表达式)
- 2. 栈的两个应用:括号匹配和表达式的计算。
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- java中正则表达式用Pattern计算字符串的结果(四则运算);分成有括号和没括号;当然也可以采用逆波兰式
- 【C++】括号匹配问题与逆波兰表达式
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- C语言实现括号匹配,中缀表达式转后缀表达式并计算的算法
- 数据结构----顺序栈实现逆波兰表达式(后缀表达式)求解
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 括号匹配检测 逆波兰表达式
- C语言实现括号匹配,中缀表达式转后缀表达式并计算具体代码实现
- 普及练习场 线性数据结构 表达式括号匹配
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 数据结构-栈的应用-算术表达式小括号匹配