zoukankan      html  css  js  c++  java
  • 前缀表达式的求值

    前面发了中缀表达式和后缀表达式的求值方法,在这儿,前缀表达式也差点儿相同

    #include<iostream>

    #include<stack>
    #include<string>
    using namespace std;
    int judge(char popx,char x);
    int func(string String,int *i);
    int calculate(int x,int y,char str); 
    int main()
    {
    int n,i;
    string a;
    stack<char>str;
    str.push('#');
    cin>>n;
    while(n--)
    {
    cin>>a;
    string substr="";
    int j;
    for(i=a.length()-1;i>=0;)
    {
    if(a[i]-'0'>=0&&a[i]-'0'<=9)
    {
    for(j=i;a[j]-'0'>=0&&a[j]-'0'<=9;j--)
    substr+=a[j];
    substr+=' ';
    i=j;
    }
    else
    {
    if(judge(str.top(),a[i])==2)  //出栈 
    {
    substr+=str.top();
                        str.pop();
    }
    else
    if(judge(str.top(),a[i])==1)  //入栈 
    {
    str.push(a[i]);
    i--;
    }
    else
    if(judge(str.top(),a[i])==4)
    {
    str.pop();
    i--;
    }
    else
    if(judge(str.top(),a[i])==3)
    {
    substr+=str.top();
                        str.pop();

    }
    }
    while(str.top()!='#')
    {
    substr+=str.top();
    str.pop();
    }
    stack<int>num;
    string a=substr;
    for(i=0;i<a.length();)
      {
    if((a[i]-'0'>=0&&a[i]-'0'<=9))
    {
    int numm=0;
    for(j=i;(a[j]-'0'>=0&&a[j]-'0'<=9);j++)
    ;
    for(int k=j-1;k>=i;k--)
     numm=numm*10+a[k]-'0';
    num.push(numm);
    i=j;
    }
    else if(a[i]!=' ')
    {
    int num1=num.top();
    num.pop();
    int num2=num.top();
    num.pop();
    num.push(calculate(num1,num2,a[i]));
    i++;
    }
    else
    if(a[i]==' ')
    i++;
    }
        cout<<num.top()<<endl;
    num.pop();
    }
    }
    int judge(char popx,char x)
    {
    if(popx=='*'||popx=='/')
    {
    if(x=='*'||x=='/'||x==')')   //入栈 
    return 1;
    else
    if(x=='+'||x=='-')
    return 2;            //出栈继续算 
    else
    if(x=='(')
    return  3;             //出栈计算 
    }
    else
    if(popx=='+'||popx=='-')
       {
    if(x=='*'||x=='/'||x=='+'||x=='-'||x==')')
    return 1;
    if(x=='(')
    return 3;
    }
    else
    if(popx==')'&&x!='(')
    return 1;
    else
    if(popx==')'&&x=='(')
    return 4;                                         //出栈后移 
    else
    if(popx=='#')
    return 1;
    }


    int calculate(int x,int y,char str)
    {
    if(str=='+')
    return x+y;
    else
    if(str=='-')
    return x-y;
    else
    if(str=='*')
    return x*y;
    else
    if(str=='/')
    return x/y;
    }
    int func(string String,int *i)
    {
    int j,num=0;
    for(j=*i;String[j]-'0'>=0&&String[j]-'0'<=9&&String[j]!=' ';j++)
    {
    num=num*10+(String[j]-'0');
    }
    *i=j;
    return num;
    }



  • 相关阅读:
    Longest Palindromic Substring问题
    twosum问题
    longest substring问题
    特殊的ARP
    【转】人肉搜索技巧
    ARP攻击
    Linux kali安装及常用命令收集
    【转】ICMP协议
    SpringBoot集成Mybatis-XML方式通用Mapper
    springMVC的controller中insert()多次,记优惠券被多次领取
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4374219.html
Copyright © 2011-2022 走看看