现在的位置: 首页 > 综合 > 正文

中缀表达式与前缀表达式的转换

2013年08月16日 ⁄ 综合 ⁄ 共 2390字 ⁄ 字号 评论关闭

中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3

后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:2 1 + 3 *

前缀表达式:同后缀表达式一样,不包含括号,运算符放在两个运算对象的前面,如:* + 2 1 3

实验目的

1.熟悉栈的应用

2.熟悉中缀表达式向前缀的转化

实验内容

1.编写程序实现中缀表达式向前缀的转化

如:      2*3/(2-1)+5*(4-1)转化后为+/*23-21*5-41

// 中缀转前缀/*

参考算法

1)求输入串的逆序。

2)检查输入的下一元素。

3)假如是操作数,把它添加到输出串中。

4)假如是闭括号,将它压栈。

5)假如是运算符,则

i)假如栈空,此运算符入栈。

ii)假如栈顶是闭括号,此运算符入栈。

iii)假如它的优先级高于或等于栈顶运算符,此运算符入栈。

iv)否则,栈顶运算符出栈并添加到输出串中,重复步骤5

6)假如是开括号,栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。

7)假如输入还未完毕,跳转到步骤2

8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。

9)求输出串的逆序。*/

Code:
  1. #include<iostream>   
  2. #include<string>   
  3. using namespace std;   
  4. char stack[50];//定义顺序栈,其中第一个元素表示栈为空;   
  5. int top=0;//栈顶指针,为0表示栈为空;   
  6. int level(char op)//判断运算符级别函数;其中* /的级别为2,+ -的级别为1;   
  7. {   
  8.     int level;   
  9.     switch(op)   
  10.     {   
  11.     case'+':   
  12.     case'-':level=1; break;   
  13.     case'*':   
  14.     case'/':level=2; break;   
  15.     default:level=0;break;   
  16.     }   
  17.     return level;   
  18. }   
  19. bool isOperator(char op)//判断输入串中的字符是不是操作符,如果是返回true   
  20. {   
  21.     if(op=='+'||op=='-'||op=='*'||op=='/')   
  22.         return true;   
  23.     else  
  24.         return false;   
  25. }   
  26. string convert(string s)//将一个中缀串转换为后缀串,   
  27. {   
  28.     string output="";//输出串   
  29.     for(int i=s.length()-1;i>=0;)//1)求输入串的逆序。   
  30.     {   
  31.         if(s[i]>=48&&s[i]<=57)   
  32.             output=output+s[i];//3)假如是操作数,把它添加到输出串中。   
  33.         if(s[i]==')')//4)假如是闭括号,将它压栈。   
  34.         {   
  35.             top++;   
  36.             stack[top]=s[i];   
  37.         }   
  38.         while(isOperator(s[i]))//如果是运算符,执行算法(5)对应操作;   
  39.         {   
  40.             if(top==0||stack[top]==')'||level(s[i])>=level(stack[top]))   
  41.             {   
  42.                 top++;   
  43.                 stack[top]=s[i];   
  44.                 break;   
  45.             }   
  46.             else  
  47.             {   
  48.                 output=output+stack[top];   
  49.                 top--;   
  50.             }   
  51.         }   
  52.         if(s[i]=='(')//6)假如是开括号,栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。   
  53.         {   
  54.             while(stack[top]!=')')   
  55.             {   
  56.                 output=output+stack[top];   
  57.                 top--;   
  58.             }   
  59.             top--;   
  60.         }   
  61.         i--;//7)假如输入还未完毕,跳转到步骤2。   
  62.     }   
  63.     while(top!=0)//8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。   
  64.     {   
  65.         output=output+stack[top];   
  66.         top--;   
  67.     }   
  68.     return output;   
  69. }   
  70. int main()   
  71. {   
  72.     string input,output;   
  73.     cout<<"请输入串:";   
  74.     cin>>input;   
  75.     output=convert(input);   
  76.     cout<<"后缀串为:";   
  77.     for(int i=output.length()-1;i>=0;i--)//9)求输出串的逆序。   
  78.        cout<<output[i];   
  79.     cout<<endl;   
  80.     return 0;   
  81. }    
  82.   

 

抱歉!评论已关闭.