c语言数组模拟栈——中缀表达式转后缀表达式

输入仅一行为中缀表达式,式中所有数字均为个位数,表达式长度小于1000。

输出一行,为后缀表达式,式中无空格。

输入样例:

2+4*8+(8*8+1)/3

输出样例:

248*+88*1+3/+

 代码实现:书写过程时候容易把情况说漏,导致无限循环加段错误;

1.扫描到数字直接入栈2,栈2用来最后输出

2.扫描到操作符,如果是左括号直接入栈

如果是右括号,将栈1中操作符依次弹出放入栈2,直到左括号停止,记得把左括号删去;

如果是加或者减,弹出栈1顶部放入栈2直到遇到左括号停止再将当前符号放入栈1,不要删除左括号

如果是乘除,1.栈1顶是加或者减直接入栈1,

2.顶部是乘除则弹出顶部直到优先级更低的运算符或者左括号出现,然后停止弹出,再将当前运算符放入栈1顶部;

eq:有很多不同的版本,不同的要求,但是大致都是那个思路,注意一些细节

#include<stdio.h>
#define MAXSIZE 1000
void change()//中缀转后缀
{
    char str[MAXSIZE+111];
    scanf("%s",str);

    char S1[MAXSIZE];
    int top1=-1;
    char S2[MAXSIZE];
    int top2=-1;    
    int i=0;
    while(str[i]!='\0')
    {
        if('0'<=str[i]&&str[i]<='9')
        //扫描到数字 直接入栈2
        {
            ++top2;
            S2[top2]=str[i];        
            i++;
        }
        else if(str[i]==')')
        //扫描到')' 从栈1出栈元素直至'('
        {
            while(S1[top1]!='(')
            {
                ++top2;
                S2[top2]=S1[top1];
                top1--;
            }
            --top1;//将左括号扔掉
            i++;
        }
        else if(str[i]=='+'||str[i]=='-')//扫描到操作符
        {
            if(top1==-1)
            //操作数栈为空或当前大于栈顶或栈顶元素为左括号,直接入栈
            {
                ++top1;
                S1[top1]=str[i];
                i++;
            }else{
                do{
                    if('('==S1[top1])
                    {
                    break;
                    }else
                    {
                        top2++;
                        S2[top2] = S1[top1];
                        top1--;
                    }
                }while(top1!=-1&&S1[top1]!='(');
                top1++;
                S1[top1] = str[i];
                i++;
            }
        }
        else if( '*'==str[i] || '/'==str[i])
        {
            //Push(&s, c);
               if(top1==-1)
            //操作数栈为空或当前大于栈顶或栈顶元素为左括号,直接入栈
            {
                ++top1;
                S1[top1]=str[i];
                i++;
            }else{
                do{
                    if('('==S1[top1]||S1[top1]=='+'||S1[top1]=='-')
                    {
                    top1++;
                    S1[top1] = str[i];
                    i++;
                    break;
                    }else
                    {
                        top2++;
                        S2[top2] = S1[top1];
                        top1--;
                    }

                }while(top1!=-1&&S1[top1]!='(');
            }  
        }else if(str[i]=='(')
        {
                top1++;
                S1[top1] = str[i];
                i++;
        }
    }

    while( top1!=-1 )
    {
        top2++;
        S2[top2] = S1[top1];
        top1--;
    }
    for(int j = 0;j<=top2;j++) 
        printf("%c",S2[j]);
    printf("\n");
}
int main()
{
    change();
    return 0;    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值