算术表达式的转换2484

 

(一)对于中缀表达式向前缀表达式的转换:需要两个栈,一个栈存储字母,另一个栈存储运算符;并且前缀表达式是从右向左开始的(后缀表达式是从左向右开始的)当遇到字母的时候,进栈1,当遇到运算符的时候,进栈2,这时候进栈2是有条件的:

1)如果当前的运算符是加减,而栈2top是乘除,这时候要把栈2top元素转移到栈1中,然后当前的元素进栈2

2)当当前的元素是左括号的时候要去找右括号,除了这两个括号之外,把他们之间的元素都放到栈1里面;

3)其他的情况入栈2就行了;之后把栈2里面的元素都给清到栈1里面,最后把栈1的元素都输出即可; 

(二)中缀表达式向后缀表达式转换:只需要一个栈,存放运算符;当遇到字母就输出,当遇到运算符就进栈,这里的进栈是有条件的:

1)如果当前的元素是加减,栈顶的元素是乘除,栈顶元素先输出,当前元素入栈;或者当前的元素是加减,栈顶的元素也是加减;或者当前的元素是乘除,栈顶的元素也是乘除;同样的操作;

2)如果当前的元素是右括号,就要去栈里面找左括号 ,并且输出除了左右括号之外的所有的运算符;

(3)其他的情况就是入栈了;最后把栈里面的所有元素都输出; 
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char z1[200], z2[200], s[200], a[200];
int main()
{
    scanf("%s",s);
    int len = strlen(s);
    int top = 0, top1 = 0, top2 = 0, i;
    for(i = len -2; i >=0; i--)
    {
        if(s[i] >= 'a' && s[i] <= 'z')
            z1[++top1] = s[i];//字母存进z1;
        else
            if((s[i] == '+' || s[i] == '-')&&(z2[top2] == '*' || z2[top2]=='/'))//当前为+-,栈顶为*/;
        {
            z1[++top1] = z2[top2];
            z2[top2] = s[i];
        }//栈顶的符号进去z1;当前符号进栈;
        else
            if(s[i] == '(')
        {
            while(z2[top2]!=')')
                z1[++top1] = z2[top2--];
            top2--;
        }//如果为‘(’就去找‘)’,在‘)’之前的符号全进z1;
        else//其他情况符号进栈z2;
            z2[++top2] = s[i];
    }
    while(top2!=0)
        z1[++top1] = z2[top2--];//最后,将z2的符号进入z1;
    while(top1!=0)
        printf("%c",z1[top1--]);//依次输出z1;
    printf("\n");
    len = strlen(s);//这是前缀;
    for(i =0 ; i< len-1;)
    {
        if(s[i] ==')'||s[i]=='(')
            i++;
        else
        {
            printf("%c",s[i]);
            i++;
        }
    }
    printf("\n");//这是中缀,不要括号;
    len = strlen(s);
    for( i = 0; i< len-1; i++)
    {
        if(s[i]>='a'&&s[i]<='z')
            printf("%c",s[i]);
        else
        {
            if(((s[i]=='+' ||s[i]=='-')&&(a[top]=='*'||a[top]=='/'))||((s[i]=='+'||s[i]=='-')&&(a[top]=='+'||a[top]=='-'))||
              ((s[i]=='*'||s[i]=='/')&&(a[top]=='*'||a[top]=='/')))//后缀算法的上述几种情况;
              {
                  printf("%c",a[top]);
                  a[top] = s[i];
              }//先输出当前符号,再存入新的符号
              else

                if(s[i]==')')
              {
                  while(a[top]!='(')
                            printf("%c",a[top--]);
                  top--;
              }//找括号,括号之内的输出;
              else
                a[++top] = s[i];//其他情况进栈等候;
        }
    }
    while(top!=0)
        printf("%c",a[top--]);//输出栈内剩余的符号;
    printf("\n");
    return 0;
}

 

算术表达式转换后缀表达式的步骤如下: 1. 创建一个空的栈和一个空的输出队列。 2. 从左到右扫描中缀表达式。 3. 如果扫描到的是操作数,将其加入输出队列。 4. 如果扫描到的是左括号,将其压入栈中。 5. 如果扫描到的是右括号,则将栈中的元素依次弹出并加入输出队列,直到遇到左括号为止。左括号右括号都不输出到结果队列。 6. 如果扫描到的是运算符,判断其优先级: - 如果该运算符的优先级低于或等于栈顶运算符的优先级,则将栈顶运算符弹出并加入输出队列,直到栈为空或者栈顶运算符优先级低于该运算符。 - 将该运算符压入栈中。 7. 重复步骤2到6,直到扫描完整个中缀表达式。 8. 如果栈中还有运算符,将它们依次弹出并加入输出队列。 9. 输出队列中的元素就是后缀表达式。 例如,将中缀表达式 "5 + 4 * 3 - 2" 转换后缀表达式: 1. 创建一个空的栈和一个空的输出队列。 2. 从左到右扫描中缀表达式,首先遇到操作数 "5",将其加入输出队列。 3. 遇到运算符 "+",将其压入栈中。 4. 遇到操作数 "4",将其加入输出队列。 5. 遇到运算符 "*",由于 "*" 的优先级高于 "+",所以将 "*" 压入栈中。 6. 遇到操作数 "3",将其加入输出队列。 7. 遇到运算符 "-",由于 "-" 的优先级低于 "*",所以将 "*" 弹出并加入输出队列,然后将 "-" 压入栈中。 8. 遇到操作数 "2",将其加入输出队列。 9. 扫描完整个表达式后,将栈中剩余的运算符依次弹出并加入输出队列,得到后缀表达式 "5 4 3 * + 2 -"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值