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


nyoj467

中缀式变成后缀式输出

思路模拟出栈入栈进行计算

将运算符与数字分别存入两个栈中
1 当遇到数字时就直接入栈(数字栈)
2 当运算符栈中为空时 第一个字符要入栈
3  当一个运算符的运算等级 大于或等于 栈顶字符 时 (循环判断)
    a 当栈顶元素不为 ( 时  输出
    else 就让该运算符入栈(退出循环)
4 当一个运算符的预算等级小于 栈顶运算符时
     a 当栈顶为 ) 时  输出
     else 入栈
        
5 最后将运算符栈中的运算符全部用掉
输出

#include<bits/stdc++.h>
using namespace std;
char op[10000];
char s[2000];
int judge(char c)
{
    if(c=='+'||c=='-')return 1;
    if(c=='/'||c=='*')return 2;
    if(c=='(')return 3;
    else
        return 4;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        while(n--)
        {
            scanf("%s",s);
            int top=0;
            for(int i=0; s[i]!='=';)
            {
                if(s[i]>='0'&&s[i]<='9'||s[i]=='.')
                {
                    while(s[i]>='0'&&s[i]<='9'||s[i]=='.')
                        printf("%c",s[i++]);
                    printf(" ");
                    continue;
                }
                if(top==0)
                {
                    op[++top]=s[i++];
                    continue;
                }
                if(judge(op[top])>=judge(s[i]))
                {
                    while(judge(op[top])>=judge(s[i])&&top>0)  //循环判断
                    {  //排除 5+6*7-9 这一类的情况 输出 5 6 7*+9-
                        //用if的话会出现 5 6 7* 9 - +;  error
                        if(op[top]!='(')
                            printf("%c ",op[top--]);
                        else
                            break;
                    }
                    op[++top]=s[i];
                    i++;
                }
                else
                {
                    if(s[i]==')')
                    {
                        while(op[top]!='(')
                            printf("%c ",op[top--]);
                        top--;
                    }
                    else
                        op[++top]=s[i];
                    i++;
                }
            }
            while(top)
                printf("%c ",op[top--]);
            printf("=\n");
        }
    }
    return 0;
}



nyoj35

表达式求值


思路模拟出栈入栈进行计算

将运算符与数字分别存入两个栈中
1 当遇到数字时就直接入栈(数字栈)
2 当运算符栈中为空时 第一个字符要入栈
3  当一个运算符的运算等级 大于或等于 栈顶字符 时 (循环判断)
    a 当栈顶元素不为 ( 时  就进行后续运算
    else 就让该运算符入栈(退出循环)
4 当一个运算符的预算等级小于 栈顶运算符时
     a 当栈顶为 ) 时  就进行后续运算  
     else 入栈
        
5 最后将运算符栈中的运算符全部用掉

 
#include<bits/stdc++.h>
using namespace std;
char op[10000];
double mi[10000];
char s[10000];
int judge(char c)
{
    if(c=='+'||c=='-')return 1;
    if(c=='/'||c=='*')return 2;
    if(c=='(')return 3;
    else
        return 4;
}
void  solve(char op[],double mi[],int &tail,int &top)
{   //通过两个栈的出栈与入栈 进行后缀式计算求值
    if(op[top]=='+')
        mi[tail-1]=mi[tail-1]+mi[tail];
    if(op[top]=='-')
        mi[tail-1]=mi[tail-1]-mi[tail];
    if(op[top]=='*')
        mi[tail-1]=mi[tail-1]*mi[tail];
    if(op[top]=='/')
        mi[tail-1]=mi[tail-1]/mi[tail];
    top--;   //字符栈出栈
    tail--;    //数字栈出栈
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        while(n--)
        {
            scanf("%s",s);
            int top=0,tail=0;
            for(int i=0; s[i]!='=';)
            {
                double sum=0;
                if(s[i]>='0'&&s[i]<='9'||s[i]=='.')      //数字的入栈
                {
                    while(s[i]>='0'&&s[i]<='9')
                    {
                        sum*=10;
                        sum+=s[i++]-'0';
                    }
                    if(s[i]=='.')
                    {
                        i++;
                        double bits=0.1;
                        while(s[i]>='0'&&s[i]<='9')
                        {
                            sum+=bits*(s[i++]-'0');
                            bits*=0.1;
                        }
                    }
                    mi[++tail]=sum;  //入栈
                    continue;
                }
                
                if(top==0)
                {
                    op[++top]=s[i++];  //运算符的入栈
                    continue;
                }
                if(judge(op[top])>=judge(s[i]))
                {
                    while(judge(op[top])>=judge(s[i])&&top>0)
                    {
                        if(op[top]!='(')
                        {
                            //后缀式计算
                            solve(op,mi,tail,top);
                        }
                        else
                            break;
                    }
                    op[++top]=s[i];
                    i++;
                }
                else
                {
                    if(s[i]==')')
                    {
                        while(op[top]!='(')
                        {
                            //后缀式计算
                            solve(op,mi,tail,top);
                        }
                        top--;
                    }
                    else
                        op[++top]=s[i];
                    i++;
                }
            }
            while(top)
            {
               solve(op,mi,tail,top);
            }
            printf("%.2lf\n",mi[tail]);
        }
    }
    return 0;
}


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值