【表达式求值---链栈处理】

数据结构作业记录。
如有BUG ,欢迎指出 !!

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define status int 
#define OK  1 
#define ERROR 0 

struct Node1{  // 存储操作数的栈 
    double op;
    Node1* next;
}node1;
struct LinkStack1{  
    Node1 *base=new Node1;
    bool init(){
        base->next=NULL;
        return OK;
    } 
    bool Push(double val){
        Node1 *p=new Node1 ;
        p->op=val;
        p->next=base->next;
        base->next=p;
        return OK;
    }
    double Pop(){
        Node1 *p;
        p=base->next;
        base->next=p->next;
        double val=p->op;
        delete p;
        return val;
    } 
    double Top(){
         return base->next->op;
    }
}OPND;

struct Node2{  //  存储 操作符的栈 
    char op;
    Node2* next;
}node2;
struct LinkStack2{
    Node2 *base=new Node2;
    bool init(){
        base->next=NULL;
        return OK;
    } 
    bool Push(char val){
        Node2 *p=new Node2 ;
        p->op=val;
        p->next=base->next;
        base->next=p;
        return OK;
    }
    char Pop(){
        Node2 *p;
            p=base->next;
            base->next=p->next;
            char val=p->op;
            delete p;
            return val;
    } 
    char Top(){
         return base->next->op;
    }
}OPTR;

bool In(char c){  //  判断输入 
    if(c>='0'&&c<='9') return ERROR;
    else return OK;
}
char pcde[7][7] = { '>','>','<','<','<','>','>',
                    '>','>','<','<','<','>','>',
                    '>','>','>','>','<','>','>',
                    '>','>','>','>','<','>','>',
                    '<','<','<','<','<','=','0',
                    '>','>','>','>','0','>','>',
                    '<','<','<','<','<','0','='};
char Precede(char a,char b){  //  优先级 
    int x,y;
    if (a == '+') x=0;if (a == '-') x=1;if (a == '*') x=2;
    if (a == '/') x=3;if (a == '(') x=4;if (a == ')') x=5;if (a == '#') x=6;
    if (b == '+') y=0;if (b == '-') y=1;if (b == '*') y=2;
    if (b == '/') y=3;if (b == '(') y=4;if (b == ')') y=5; if (b == '#') y=6;
    //printf("fuhao  %c\n",pcde[x][y]);
    return pcde[x][y];
}
double Operate(double a,char ch,double b){  //  计算 
    double ans;
    switch(ch){
        case '+':{
            ans=a+b;
            break;
        } 
        case '-':{
            ans=a-b;
            break;
        }
        case '*':{
            ans=a*b;
            break;
        }
        case '/':{
            ans=a/b;
            break;
        }
    }
    return ans;
}

double  Calculate(){
    OPND.init();
    OPTR.init();
    printf("请输入表达式(表达式以 # 结束输入):");
    OPTR.Push('#');
    char ch; cin>>ch;
    while(ch!='#'||OPTR.Top()!='#') {
        if(!In(ch)){  
            double x=0;   //  获取超过1位数的数字值 
            while(!In(ch)){
                x=x*10+ch-'0';
                cin>>ch;
            } 
            OPND.Push(x); 
        }
        else switch(Precede(OPTR.Top(),ch)){ 
            case '<':{
                OPTR.Push(ch); cin>>ch;
                break;
            }
            case '>':{
                char theta; double a,b,c; 
                theta=OPTR.Pop();
                a=OPND.Pop(); b=OPND.Pop();
                //printf("%lf %lf %c\n",a,b,theta);
                OPND.Push(Operate(b,theta,a));
                break;
            }
            case '=':{
                OPTR.Pop(); cin>>ch;
                break;
            }
        }
    }
    return OPND.Top();
}

int main(){
    puts("-------欢迎使用-------");
    while(1){
        printf("\nA :计算表达式值(大于9的数字也可以计算)\n");
        printf("Q :退出\n");
        char op[5];puts("");
        printf("请输入操作指令: ");
        scanf("%s",op);
            if(op[0]=='Q') break;
        else 
            if(op[0]=='A')  printf("表达式的值为: %.3lf\n", Calculate()); 
        else  
            puts("您输入的指令有误,请重新选择!!");
    }
    puts("欢迎下次使用!");
    return 0;
}

二 C++ 自带的栈写。

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6;
char s[MAXN];
char pcde[7][7] = { '>','>','<','<','<','>','>',
                    '>','>','<','<','<','>','>',
                    '>','>','>','>','<','>','>',
                    '>','>','>','>','<','>','>',
                    '<','<','<','<','<','=','0',
                    '>','>','>','>','0','>','>',
                    '<','<','<','<','<','0','='};
char Precede(char a,char b){  //  优先级 
    int x,y;
    if (a == '+') x=0;if (a == '-') x=1;if (a == '*') x=2;
    if (a == '/') x=3;if (a == '(') x=4;if (a == ')') x=5;if (a == '#') x=6;
    if (b == '+') y=0;if (b == '-') y=1;if (b == '*') y=2;
    if (b == '/') y=3;if (b == '(') y=4;if (b == ')') y=5; if (b == '#') y=6;
    //printf("fuhao  %c\n",pcde[x][y]);
    return pcde[x][y];
}
double Calculate(){
    stack<double>S;
    stack<char>F;
    F.push('#'); int i=1;
    while(s[i]!='#'||F.top()!='#'){
        if(s[i]>='0'&&s[i]<='9') {
                double x=0;
                while(s[i]>='0'&&s[i]<='9'){
                    x=x*10+s[i]-'0';
                    i++;
                }   
                S.push(x);
            }else switch(Precede(F.top(),s[i])){
                case '<':{
                    F.push(s[i]); i++;
                    break;
                }
                case '>':{
                    double a,b,ans;char ch;
                    ch=F.top(); F.pop();
                    a=S.top();S.pop();b=S.top();S.pop();
                            if(ch=='+') ans=a+b;
                        else 
                            if(ch=='-') ans=a-b;
                        else 
                            if(ch=='*') ans=a*b;
                        else 
                            if(ch=='/') ans=a/b;
                //  printf("%lf %lf %c\n",a,b,ch); 
                    S.push(ans);
                    break;
                }
                case '=':{   
                    F.pop();i++;
                    break;  
                }
        }   
    }
    return S.top();
}
int main(){
    int T ;scanf("%d",&T);
    while(T--){
        scanf("%s",s+1);
        int len=strlen(s+1);s[0]=s[len+1]='#';
        printf("%.3lf\n",Calculate());
    }   
    return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值