四则运算

1.构造后缀表达式

  • 利用stack,存储操作符;自定义一个数据结构,存放val 和 op;
  • 入栈的操作符优先级要高于栈顶的操作符。如果当前op优先级低,则需要把栈顶的op先出栈,再入栈
  • 有可能输入的字符大于9, 则需要判断:从字符串中找出数字的计算方法 
  •  

https://blog.csdn.net/liqiutuoyuan/article/details/72854471

2.利用后缀表达式计算值

  • 利用stack 存储值
  • 遇到op,就出栈两个元素。注意先出栈的是被减数。

https://blog.csdn.net/yangquanhui1991/article/details/52187375

 

struct node{
    char op=NULL;
    int val=INT_MIN;
};

int main(){
    char ch[20];
    cin >> ch;
    cout<< *ch;
    stack op;
    vector express;
    int i = 0;
    while(ch[i]!='\0'){
        node temp;
        if('0' <= ch[i] && ch[i] <= '9'){ //数字  从字符串中找出数字的计算方法
            int num = 0;
            while('0' <= ch[i] && ch[i] <= '9'){
                num = num *10 +ch[i] -'0';
                i++;
            }
            i--;
            temp.val = num;
            express.push_back(temp);
        }else{// 操作符 “+” “-”  ; “)” ; “(”, “*” “/" 
            if(!op.empty() && (op.top() == '*' || op.top() == '/') && (ch[i] == '+' || ch[i] == '-')){
                while(!op.empty() && (op.top() == '*' || op.top() == '/')){
                    temp.op = op.top();
                    op.pop();
                    express.push_back(temp);
                }
                op.push(ch[i]);
            }else if(ch[i] == ')'){
                while(!op.empty() && op.top() != '('){
                    temp.op = op.top();
                    express.push_back(temp);
                    op.pop();
                }
                op.pop();
            }else{
                op.push(ch[i]);
            }
        }
        i++;
    }
    while(!op.empty()){
        node temp;
        temp.op =op.top();
        express.push_back(temp);
        op.pop();
    }
    //计算后缀表达式
    stack s;
    for(int i = 0; i < express.size(); i++){
        if(express[i].val!=INT_MIN){
            s.push(express[i].val);
            
        }else{
            int b = s.top();
            s.pop();
            int a = s.top();
            s.pop();
            cout<< a << " " << b << " " << express[i].op << endl;
            switch(express[i].op){
                case '+':s.push(a+b); break;
                case '-':s.push(a-b); break;
                case '*':s.push(a*b); break;
                case '/':s.push(a/b); break;
                default: break;
            }
        }
    }
    cout<< s.top()<

 

你可能感兴趣的:(算法)