逆波兰式(数组建栈+中缀表达式转后缀表达式+中缀表达式转前缀表达式)

逆波兰式(字符栈)

转自

https://www.cnblogs.com/unixfy/p/3344550.html

 

栈高栈出

栈小外进

同号栈高

左括必进遇右出

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
int main()
{
    int i;
    char str[2000];
    char seqstack[2000];
    seqstack[0]='#';//用这个做首元素可做pop终止的操作。
    int top=0;
    scanf("%s",str);
    int len=strlen(str);
    for(i=0;i<len;i++)
    {
                                        //因为只有括号与加减乘除符号,符号不多,直接if讨论处理就好了。
        if(str[i]=='(')             //先考虑左右括号的情形
        {
            seqstack[++top]='(';         //左括号直接入栈
        }
        else if(str[i]==')')
        {
            while(seqstack[top]!='(')    //右括号就找第一个左括号,并将到左括号为止的所有元素pop,(包括左括号)
            {
                printf("%c",seqstack[top]);
                seqstack[top]=0;   //pop操作
                top--;
            }
            seqstack[top]=0;   //这步是除'('
            top--;
        }                                   //因为将括号额外考虑,所以,*,/优先级最高,直接入栈
        else if(str[i]=='*'||str[i]=='/')  //若c1<c2,则c2进栈继续扫描后面表达式;c1是指存运算符的栈,c2是指输入的字符串
        {
              while(seqstack[top]=='*'||seqstack[top]=='/')//c2与c1比较都是用while的
            {                                            //*,/比*,/优先级低。
                printf("%c",seqstack[top]);
                seqstack[top]=0;
                top--;
            }
                                           //若c1=c2,则(“=”),即括号内运算结束,将c1出栈,并且c2放弃,继续扫描后面表达式;
             seqstack[++top]=str[i];       //若c1>c2,则将c1出栈,并在操作数栈取出两个元素a和b按c1做运算,运算结果进OPND.
        }                                  //重复直到表达式求值完毕。
        else if(str[i]=='+'||str[i]=='-')  //c1,c2符号相同的情况下,c1>c2,即栈的优先级更高。
        {
            while(seqstack[top]=='*'||seqstack[top]=='/'||seqstack[top]=='+'||seqstack[top]=='-')//c2与c1比较都是用while的
            {                                            //+,-比*,/,+,-优先级低。
                printf("%c",seqstack[top]);
                seqstack[top]=0;             //pop操作
                top--;
            }
            seqstack[++top]=str[i];        //push操作
		}
		else                               //除了左括号外,运算符都要判断栈首是否为空,但本题不需要,因为栈不存数字,只是存表达式
        printf("%c",str[i]);
    }
    while(top!=0)
    {
        printf("%c",seqstack[top]);
        seqstack[top]=0;             //pop操作
        top--;
    }
    printf("\n");
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值