程序开发简记(结对团队博客2)--初级计算器所需的算法,栈和哈希表
用栈模拟符号树
支持带括号的式子运算
将符号作为根节点,数字作为叶子节点,符号越靠近根节点,其计算的优先级更高
#include <iostream> #include <stack> #include <unordered_map> #include <string> using namespace std; stack <int> num; //存储数字 stack <char> op; //存储符号 unordered_map<char, int> h={{'+',1},{'-',1},{'*',2},{'/',2}}; //将*和/作为更高的优先级 void eval() { int b = num.top(); num.pop(); int a = num.top(); num.pop(); int o = op.top(); op.pop(); if(o == '+') a += b; if(o == '-') a -= b; if(o == '*') a *= b; if(o == '/') a /= b; num.push(a); } int main(){ string s ; cin>>s; for(int i = 0 ; i < s.size() ;i ++) { char c = s[i]; if( isdigit(c)) //读取string中的数字,并将其插入到num的栈中 { int x = 0, j = i; while( j <s.size() && isdigit(s[j])) x = x * 10 + s[j++] - '0'; i = j -1; num.push(x); } else if (c == '(') //检查到左括号,直接插入op的stack { op.push(c); } else if( c == ')') //检查到右括号的,直接计算到左括号所在位置 {
用栈模拟符号树
支持带括号的式子运算
将符号作为根节点,数字作为叶子节点,符号越靠近根节点,其计算的优先级更高
#include <iostream> #include <stack> #include <unordered_map> #include <string> using namespace std; stack <int> num; //存储数字 stack <char> op; //存储符号 unordered_map<char, int> h={{'+',1},{'-',1},{'*',2},{'/',2}}; //将*和/作为更高的优先级 void eval() { int b = num.top(); num.pop(); int a = num.top(); num.pop(); int o = op.top(); op.pop(); if(o == '+') a += b; if(o == '-') a -= b; if(o == '*') a *= b; if(o == '/') a /= b; num.push(a); } int main(){ string s ; cin>>s; for(int i = 0 ; i < s.size() ;i ++) { char c = s[i]; if( isdigit(c)) //读取string中的数字,并将其插入到num的栈中 { int x = 0, j = i; while( j <s.size() && isdigit(s[j])) x = x * 10 + s[j++] - '0'; i = j -1; num.push(x); } else if (c == '(') //检查到左括号,直接插入op的stack { op.push(c); } else if( c == ')') //检查到右括号的,直接计算到左括号所在位置 { while( op.top() != '(') eval(); op.pop(); } else { while(op.size() && h[c] <= h[op.top()]) eval(); //如果是+,-,*,/的符号,比较符号优先级 op.push(c); } } while(op.size()) eval(); cout<<num.top(); return 0; }
while( op.top() != '(') eval(); op.pop(); } else { while(op.size() && h[c] <= h[op.top()]) eval(); //如果是+,-,*,/的符号,比较符号优先级 op.push(c); } } while(op.size()) eval(); cout<<num.top(); return 0; }