利用栈解决括号匹配和逆波兰表达式
2017-11-12 19:12
330 查看
当我们学习了栈这种数据结构滞后,我们就可以利用栈来解决一些实际问题。这里是我们给出的动态顺序栈的实现
template< class T> class Stack { public: Stack() :_array(new T[3]) , _size(0) , _capacity(3) {} void Push(const T& data) { _Checkcapacity(); _array[_size++] = data; } void Pop() { _size--; } bool Empty() { if (_size == 0) return true; return false; } T& Top() { return _array[_size-1]; } T& Top()const { return _array[_size - 1]; } size_t Size() { return _size; } size_t Capacity() { return _capacity; } void _Checkcapacity() { if (_size >= _capacity) { T* newarray = new T[_size * 2 + 3]; for (int i = 0; i < _size; i++) { newarray[i] = _array[i]; } _capacity = _size * 2 + 3; delete _array; _array = newarray; } } ~Stack() { if (_array) delete _array; _array = NULL; _size = 0; _capacity = 0; } private: T * _array; int _size; int _capacity; };1.括号匹配问题char a[] = "(())abc{[(])}";//左右括号次序不对char b[] = "(()))abc{[]}";//右括号多于左括号char c[] = "(()()abc{[]}";//左括号多于右括号char d[] = "(())abc{[]()}";///左右括号正确bool MatchBrackets(char* c,int size){ Stack<char> ch; for (int i = 0; i < size; i++) { if (c[i] == '(' || c[i] == '{' || c[i] == '[') { ch.Push(c[i]); continue; } else if (c[i] == ')' || c[i] == ']' || c[i] == '}') { if (ch.Empty()) { cout << "右括号多于左括号" << endl; return true; } else { if ((c[i]==')'&&ch.Top()=='(')||(c[i] == ']'&&ch.Top() == '[')|| (c[i] == '}'&&ch.Top() == '{')) { ch.Pop(); continue; } else { cout << "左右括号匹配次序不正确" << endl; return false; } } } else { continue; } } if (ch.Empty()) { cout << "匹配正确" << endl; return true; } else { cout << "左括号多于右括号" << endl; return false; }}2.逆波兰表达式问题实现代码:enum op { OPERAND,OPERATOR, ADD, SUB, MUL, DIV };typedef struct Cell{op _op;int data;}Cell;int RPN(Cell*s, int size){Stack<int> c;for (int i = 0; i < size; i++){if (s[i]._op == OPERAND){c.Push(s[i].data);continue;}else if (s[i]._op == OPERATOR){int right = c.Top();c.Pop();int left = c.Top();c.Pop();switch (s[i].data){case ADD:c.Push(left + right);break;case SUB:c.Push(left - right);break;case MUL:c.Push(left*right);break;case DIV:assert(right != 0);c.Push(left / right);break;default:assert(0);break;}}}return c.Top();}下面我们给出 表达式4000:
Cell A[] = { {OPERAND,12},{OPERAND,3},{OPERAND,4},{OPERATOR,ADD},{OPERATOR,MUL},{OPERAND,6},{OPERATOR,SUB},{OPERAND,8},{OPERAND,2},{OPERATOR,DIV},{OPERATOR,ADD} };即 表达式 12*(3+4)-6+8/2 =82;来看程序运行结果:结果正确。
相关文章推荐
- 数据结构中的栈,在解决很多问题都有用处,比如括号匹配,迷宫求解,表达式求值等等 java中有封装好的类,可以直接调用。
- 栈及栈的应用(括号匹配和逆波兰表达式)
- 栈的应用----括号匹配、逆波兰表达式【数据结构】
- 【C++】括号匹配问题与逆波兰表达式
- 【数据结构】动态栈+括号匹配+逆波兰表达式(后缀表达式计算)
- 括号匹配检测 逆波兰表达式
- 如何利用正则表达式匹配花括号内的内容
- 利用栈判断输入的表达式中的括号是否匹配(假设只含有左、右括号)
- 动态栈的实现,括号匹配问题,逆波兰表达式
- 栈的应用(括号匹配、逆波兰表达式)
- 利用正则表达式匹配所有符合条件的子串
- 表达式括号匹配
- C语言简单计算器(基于栈和逆波兰表达式)这几天忙着开学的事宜,一直没时间刷提,就把今天刚做好的课程设计——简易计算器贴在这给大家参考!(计算小数时要用0减正数并用括号括起来,这一点不足以后再改进)
- 表达式括号匹配
- 利用栈结构判断括号匹配问题
- 栈的应用Ⅰ--后缀表达式 括号匹配
- 巧用多个正则表达式解决取反替换问题(解决不匹配则替换问题)——用sed和perl的正则表达式
- 重温数据结构-栈的应用:进制转换,括号匹配检测,行编辑,迷宫求解,求表达式的值
- 利用触发器和INSERT INTO ...SELECT...解决Oracle 数据匹配问题
- 正则表达式匹配多行文本的解决方法