[栈的应用]动态顺序栈的实现、逆波兰表达式

来源:互联网 发布:java vbs音量 编辑:程序博客网 时间:2024/06/13 23:51

动态顺序栈的实现

#define N 5#define M 2template <class T>class Stack{public:Stack():_array(new T[N]), _capacity(N), _size(0){}void Push(const T& data){CheckCapacity();_array[_size++] = data;}void Pop(){if (!Empty()){_size--;}}T& Top(){return _array[_size-1];}T& Top()const{return _array[_size-1];}size_t Size()const{return _size;}size_t Capacity()const{return _capacity;}bool Empty()const{return _size == 0;}private:void CheckCapacity(){size_t size = Size();size_t capacity = Capacity();size_t newcapacity = capacity*M;if (_size >= _capacity){T* newarray = new T[newcapacity];for (size_t i = 0; i < size; i++){newarray[i] = _array[i];}delete[] _array;_array = newarray;_capacity = newcapacity;}}private:T* _array;size_t _capacity;size_t _size;};int main(){Stack<int> s;s.Push(10);s.Push(9);s.Push(8);s.Push(7);s.Push(6);s.Push(5);s.Push(4);cout << "栈顶元素为:" << s.Top() << endl;cout << "Size=" << s.Size() << endl;cout << "Capacity=" << s.Capacity() << endl;s.Pop();s.Pop();cout <<"栈顶元素为:"<< s.Top() << endl;cout << "Size=" << s.Size() << endl;cout << "Capacity=" << s.Capacity() << endl;system("pause:");return 0;}
逆波兰表达式

#include <stack>#include <vector>//运算符bool Isopterator(const char ch){if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '#')return true;return false;}//栈内运算符优先级int isp(char ch){switch (ch){case '#':return 0;case '(':return 1;case '+':case '-':return 3;case '*':case '/':case '%':return 5;case ')':return 6;default:cout << "算法不合理" << endl;}return 0;}//栈外预算符的优先级int icp(char ch){switch (ch){case '#':return 0;case ')':return 1;case '+':case '-':return 2;case '*':case '/':case '%':return 4;case '(':return 6;default:cout << "算法不合理" << endl;}return 0;}//将表达式转化为后缀表达式void CalcRPN(char* exp){stack<char> op;//操作符栈vector<char> str;op.push('#');//初始化操作符栈int i = 0;while (exp[i]){if (!Isopterator(exp[i]))//操作数{str.push_back(exp[i]);cout << exp[i];}else//操作符{cout << " ";char ch = op.top();if (icp(exp[i]) > isp(ch)){op.push(exp[i]);}else if (icp(exp[i]) < isp(ch)){op.pop();str.push_back(exp[i]);cout << ch;continue;}else{if (op.top() == '(')//继续读取下一个字符{op.pop();}}}++i;}while (op.top() != '#')//处理剩下的栈内操作符{char op1 = op.top();//栈顶元素str.push_back(op1);cout << op1;op.pop();}cout << endl;str.push_back(0);}

阅读全文
0 0