中缀式 变 前缀试,变后缀试,然后表达式求值

原创 2013年12月05日 16:16:38
/****自己以为自己代码差不多了,做了这道题才知道还远着呢http://acm.nyist.net/JudgeOnline/problem.php?pid=409,擦,吐槽一下,六,七个小时的受不了
*///////
#include<ctype.h>
#include<cstdio>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<iostream>
using namespace std;

int _pri(char s)
{
    switch(s)
    {
        case '=':return -1;break;
        case '+':return 0;break;
        case '-':return 0;break;
        case '*':return 1;break;
        case '/':return 1;break;
        case '(':return 2;break;
        case ')':return 2;break;
    }
}
int _using(char c)
{
    switch(c)
    {
        case '+':return -1;break;
        case '-':return -2;break;
        case '*':return -3;break;
        case '/':return -4;break;
    }
}
double totly(double *a,int n)
{
    stack <double> x;
    double sum =0;
    for(int i=0;i<n;i++)
    {
        if(a[i]>=0)
        x.push(a[i]);
        else
        {
            double a1 = x.top();
            x.pop();
            double a2 = x.top();
            x.pop();
            if(a[i]==-1)
            sum=(a1+a2);
            else
            if(a[i]==-2)
            sum=(a2-a1);
            else
            if(a[i]==-3)
            sum=(a2*a1);
            else
            if(a[i]==-4)
            sum=(a2/a1);
            x.push(sum);

        }
    }
    return sum;
}
int main()
{
    int n,m;
    double a[1000];
    char _sory[1000];
    int icase;
    string str,str1;
    stack <char> s;
    stack <char> s1;
    scanf("%d",&icase);
    while(icase--){
    string nus[1000];
    cin>>str;
    str1 = str;
    n = str1.size();
    m = 0;n-= 2;
    s1.push('=');
    while(n>=0&&!s1.empty()){
    if(isdigit(str1[n])||str1[n]=='.'){
    while(isdigit(str1[n])||str1[n]=='.')
    nus[m] = str1[n--]+nus[m];
    m++;
    }
    else{
        if(str1[n]=='('){
           while(!s1.empty()&&s1.top()!=')')  {

           nus[m++]= s1.top();
           s1.pop();
           }
          n--;
          s1.pop();
           }
           else
            if(!s1.empty()&&_pri(s1.top())<=_pri(str1[n])){
        s1.push(str1[n--]);

        }
        else
        {

            while(!s1.empty()&&_pri(s1.top())>_pri(str1[n])&&s1.top()!=')'){
                  nus[m++] = s1.top();
                  s1.pop();

            }
            s1.push(str1[n--]);
        }

      }
    }

    while(!s1.empty()){
      nus[m++]= s1.top();
      s1.pop();
    }
    m -= 2;
    for(;m>=0;m--)
    cout<<nus[m]<<" ";
    cout<<"="<<endl;
    int cur = 0;
    char ch = *str.begin();
    while(ch != '=')
    {
        if(ch<='9'&&ch>='0'){
        int cn = 0;
           while(ch<='9'&&ch>='0'||ch=='.'){

               _sory[cn++] = ch;
               str.erase(str.begin());
               ch = *str.begin();

           }
           _sory[cn] = '\0';
           cout<<_sory<<" ";
           a[cur++] = atof(_sory);
        }
        else{
            if(s.empty())s.push(ch);
            else{

                if(ch==')')
                {

                    while(!s.empty()&&s.top()!='('){
                        cout<<s.top()<<" ";
                        a[cur++] = _using(s.top());
                        s.pop();
                    }

                  if(!s.empty()) s.pop();
                }
                else
                if((_pri(s.top())<_pri(ch)))
                       s.push(ch);
                else
                {
                    while(!s.empty()&&_pri(s.top())>=_pri(ch)&&s.top()!='('){
                    cout<<s.top()<<" ";
                    a[cur++] = _using(s.top());
                    s.pop();
                    }
                    s.push(ch);
                }

            }
            str.erase(str.begin());
            ch = *str.begin();
        }
        }
       while(!s.empty()){
        cout<<s.top()<<" ";
        a[cur++] = _using(s.top());
        s.pop();
    }
    cout<<"="<<endl;
    printf("%.2lf\n",totly(a,cur));
    }
}

中缀、前缀和后缀表达式求值问题

中缀表达式求值问题   中缀表达式的求值问题是一个比较常见的问题之一,我们通常在编写程序时,直接写出表达式让编译器去处理,很少去关心编译器是怎么对表达式进行求值的,今天我们来一起了解一下其中具体的原...

前缀 中缀 后缀 表达式求值问题

原文链接:http://www.cnblogs.com/dolphin0520/p/3708602.html                            中缀表达式求值问题   中缀表达...

中缀表达式转换为前缀及后缀表达式并求值(java实现)

转载自:http://www.java3z.com/cwbwebhome/article/article8/83542.html?id=4612 它们都是对表达式的记法,因此也被称为前缀记法、中缀记法...

中缀表达式转换为前缀及后缀表达式并求值【摘】

它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。 举例: (3 +...

中缀表达式转换为前缀及后缀表达式并求值【摘】

它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。 举例: (3 +...

中缀表达式变后缀表达式并求值

//#include "stdafx.h" #include #include //包含栈类 #include using namespace std; int prior(char ...

后缀表达式(逆波兰式)、中缀表达式的转换与求值

/***************************************************************************************************...
  • ygqwan
  • ygqwan
  • 2012年08月13日 10:00
  • 1411

表达式求值 中缀式转换成后缀式

中缀式变成后缀式输出 思路模拟出栈入栈进行计算 将运算符与数字分别存入两个栈中 1 当遇到数字时就直接入栈(数字栈) 2 当运算符栈中为空时 第一个字符要入栈 3  当一个运算符的运算等级 大于或...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:中缀式 变 前缀试,变后缀试,然后表达式求值
举报原因:
原因补充:

(最多只允许输入30个字)