四则表达式计算(stl stack, 不带注释)

#include <iostream>
#include <stack>
#include <stdio.h>
using namespace std;

stack<char> opStack;
stack<double> numStack;
char exp[205], postExp[205];


void trans(char* exp, char* postExp) {
    char ch;
    int i = 1, j = 0;
    ch = exp[0];
    while(ch != 0) {
        switch(ch) {
        case '(':
            opStack.push(ch);
            break;
        case ')':
            while(opStack.top() != '(') {
                postExp[j++] = opStack.top();
                opStack.pop();
            }
            opStack.pop();
            break;
        case '+':
        case '-':
            while(!opStack.empty() && opStack.top() != '(') {
                postExp[j++] = opStack.top();
                opStack.pop();
            }
            opStack.push(ch);
            break;
        case '*':
        case '/':
            while(!opStack.empty() && opStack.top() != '('
                    && (opStack.top() == '*' || opStack.top() == '/') ) {
                    postExp[j++] = opStack.top();
                    opStack.pop();
            }
            opStack.push(ch);
            break;
        default:
            while(ch >= '0' && ch <= '9') {
                postExp[j++] = ch;
                ch = exp[i++];
            }
            i --;
            postExp[j++] = ' ';
        }
        ch = exp[i++];
    }
    while(!opStack.empty()) {
        postExp[j++] = opStack.top();
        opStack.pop();
    }
    postExp[j] = 0;
}
double calC(char* exp) {
    double tmp;
    char ch = postExp[0];
    int i = 1;
    double a, b;
    while(ch != 0) {
        if(ch >= '0' && ch <= '9') {
            tmp = 0;
            while(ch >= '0' && ch <= '9') {
                tmp = 10 * tmp + ch - '0';
                ch = postExp[i++];
            }
            numStack.push(tmp);
        }
        else {
            b = numStack.top(), numStack.pop();
            a = numStack.top(), numStack.pop();
            switch(ch){
            case '+':
                numStack.push(a + b);
                break;
            case '-':
                numStack.push(a - b);
                break;
            case '*':
                numStack.push(a * b);
                break;
            case '/':
                numStack.push(a / b);
                break;
            default:
                break;
            }
        }
        ch = postExp[i++];
    }
    return numStack.top();
}
int main() {

    double ans = 0;
    cin >> exp;
    trans(exp, postExp);
  //  cout << postExp << endl;
    ans = calC(postExp);
    printf("%.2f\n", ans);
    return 0;
}

测试数据:
3+(12/(2*2+1))
5.40

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include<stdio.h> #include<stdlib.h> struct four { double a; struct four *next; //定义结构体,作为链表的节点. }; void main() { double sum(void); //函数声明. 该函数返回等计算结果. 有优先级的运算符号在函数内部先进行计算。 double sum1; printf("请输入等,以 '=' 结束, 例如“ 2*2*3-2/2= ” 结果将自动保留六位有效数字\n"); sum1=sum(); printf("该等的结果为:\t%f\n\n",sum1); } double sum(void) { struct four *head,*pnew,*ptail,*p,*q; //结构体成员. char ah; double s=0,last; //last作为 pnew->a 的前一个数. int j=1; q=(struct four *)malloc(sizeof(struct four)); scanf("%lf%c",&q->a,&ah); last=q->a; while(j==1 && ah!='=') //头节点的建立. { switch(ah) //对运算符号的优先级进行选择,优先级高的先进行计算. { case '+': j=0; continue; break; case '-': j=0; continue; break; case '*': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last*q->a; break; case '/': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last/q->a; break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } last=q->a; scanf("%c",&ah); } pnew=(struct four *)malloc(sizeof(struct four)); pnew->a=q->a; //将头节点的信息传递给 head 和 ptail. head=ptail=pnew; while(ah!='=') //接下来节点的建立. { pnew=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&pnew->a); switch(ah) { case '*': pnew->a=last*pnew->a; break; case '/': pnew->a=last/pnew->a; break; case '+': break; case '-': pnew->a=-pnew->a;break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } scanf("%c",&ah); if(ah=='-' || ah=='+'|| ah=='=') //将进行传递 ptail->next=pnew. { ptail->next=pnew; ptail=pnew; } last=pnew->a; } ptail->next=NULL; p=head; while(p!=NULL) //各个节点数相加的结果,有优先级符号的已经先计算了. { s=s+(p->a); p=p->next; } return s; //返回运算结果. }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值