程序开发简记(结对团队博客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; }

 

posted @ 2021-10-06 22:08  pioner  阅读(56)  评论(0编辑  收藏  举报