把中缀表达式化为后缀表达式

转载 2012年03月25日 11:46:36

//把中缀表达式化为后缀表达式
//基本解题思路
//使用栈的算法也很多,说个好想的。
//假设表达式的字符来自输入流in,建立栈A存放运算符,B存放结果,从in读入一个操作数压进B,读入一个运算符压进A,如此反复。 
//1.读入一个元素e 
//2.如果e是操作数或者(,压入B,跳转到1 
//3.如果e是运算符(不包含括号),跳转到3.1 
//4.如果e是),跳转到4.1 
//5.如果e是EOF,即输入流结束,反复弹出A栈顶压入B,直到A为空,算法结束,B从栈底到栈顶的符号即为后缀表达式(需要把B翻个个儿^_^)

//3.1.判断A的栈定符号t,如果t不为(,且优先级大于等于e,则弹出t压入B,跳转到4,如果t为空,即栈中为空,或其他情况直接把e压入A,跳转到1 
//4.1.弹出A的栈顶压入到B,如此反复直到弹出的符号为(,(和)不要压入B,跳转到1
 
#i nclude<stdio.h>
#i nclude<stdlib.h>
#define MAX 100
typedef struct         //存放结果
{
 char data[MAX];
 int top;
}Stack1;
typedef struct         //存放符号
{
 char data[MAX];
 int top;
}Stack2;


//对栈进行初始化
void Init_Stack(Stack1 *SS1,Stack2 *SS2)
{
 SS1->top=SS2->top=-1;
 //SS1->data[SS1->top]=SS2->data[SS2->top]=0;
}


//判断+ - * /
int Jadge(char ch,Stack1 *SS1,Stack2 *SS2)
{
 int i;
 switch(ch)
 {
    case '+':  //对'+'号的处理
       if(SS1->data[SS1->top]=='-'||SS1->data[SS1->top]=='*'||SS1->data[SS1->top]=='/') 
    {   
     SS2->data[++SS2->top]=SS1->data[SS1->top--];
     SS1->data[++SS1->top]=ch;
  }
    else
     SS1->data[++SS1->top]=ch;
    return 1;
       /////////////////////////////
    case '-': //对'-'号的处理
    if(SS1->data[SS1->top]=='+'||SS1->data[SS1->top]=='*'||SS1->data[SS1->top]=='/') 
  {
     SS2->data[++SS2->top]=SS1->data[SS1->top--];
     SS1->data[++SS1->top]=ch;
  }

    else
     SS1->data[++SS1->top]=ch;
    return 1;
    /////////////////////////////

    case '*':  //对'*'的处理
    if(SS1->data[SS1->top]=='/')   
  {
     SS2->data[++SS2->top]=SS1->data[SS1->top--];
     SS1->data[++SS1->top]=ch;
     }
        else
   SS1->data[++SS1->top]=ch; 
  return 1;

    ////////////////////////////

    case '/':  //对'/'的处理
    if(SS1->data[SS1->top]=='*') 
  {
     SS2->data[++SS2->top]=SS1->data[SS1->top--];
     SS1->data[++SS1->top]=ch;
     }
        else
   SS1->data[++SS1->top]=ch;
     return 1;

    /////////////////////////////
     case ')':   //对')'的处理
  i=SS1->top;

  //判断栈SS1中是否有与')'匹配的'('
  while(SS1->data[i]!='(' && i>=0)i--;
   if(i==-1)return 0;

        //遇到当')'遇到'('的操作
  while(SS1->data[SS1->top]!='(')
  {
   SS2->data[++SS2->top]=SS1->data[SS1->top--];
  }
  SS1->top--;
    
  return 1;
  //break;
       //3+4/(5-(6*5))*8
 }
}

void main()
{

 
 Stack1 *SS1=(Stack1 *)malloc(sizeof(Stack1));
 Stack2 *SS2=(Stack2 *)malloc(sizeof(Stack2));
 Init_Stack(SS1,SS2);
 //printf("%d %d",SS1->data[SS1->top],SS2->data[SS2->top]);
 int i,flag,k=0,sum1,sum2;
 char ch[MAX];
 printf("请输入中缀表达式:");
 gets(ch);
 while(ch[k])
 {
  // printf("%c ",*(ch+i));
   //i++;
  if(ch[k]>='0'&&ch[k]<='9')
   SS2->data[++SS2->top]=ch[k];
  else if(ch[k]=='(')
   SS1->data[++SS1->top]=ch[k];
  else if(ch[k]=='+' ||ch[k]=='-'||ch[k]=='*' || ch[k]=='/'||ch[k]==')') 
   flag=Jadge(ch[k],SS1,SS2);
   if(!flag) break;
   k++;
 }
 if(flag)
 {
  //判断'('与')'的个数是否相同
  for(i=0;i<=SS1->top;i++)
  {
   if(ch[i]=='(') sum1++;
   if(ch[i]==')') sum2++;
  }
  if(sum1!=sum2)
  {
   printf("表达式错误.\n");
   return;
  }
  //输出后缀表达式
  printf("后缀表达式为:");
  for(i=0;i<=SS2->top;i++)
   printf("%c ",SS2->data[i]);
  for(i=SS1->top;i>=0;i--)
   printf("%c ",SS1->data[i]);
  printf("\n");
 }

 else
  printf("表达式错误.\n");

 
}

 

前缀、中缀、后缀表达式

  • 2015年06月23日 16:28
  • 6KB
  • 下载

前缀、中缀、后缀表达式和二叉树

概念: 前缀表达式(Prefix Notation)是指将运算符写在前面操作数写在后面的不包含括号的表达式,而且为了纪念其发明者波兰数学家Jan Lukasiewicz,所以前缀表达式也叫做“波...

java中缀变后缀表达式

  • 2007年08月10日 15:44
  • 1KB
  • 下载

(转)前缀、中缀、后缀表达式及转换与应用

一.表达式的三种形式:     中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3     后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向...
  • liaote
  • liaote
  • 2013年05月21日 14:38
  • 531

中缀转后缀表达式

  • 2013年08月24日 11:38
  • 3KB
  • 下载

C#使用栈实现中缀转后缀表达式

  • 2016年06月03日 09:40
  • 49KB
  • 下载

中缀/后缀表达式转换-使用四则混合运算表达式生成树

很多资料讨论了四则混合运算的中缀表达式和后缀表达式的变换方法,有的很简单,有的很复杂,然而这种简单和复杂只是表现在程序上的,肉眼观察加人工操作完成这样的任何实际上十分简单,因为人脑习惯于于用自己的方式...
  • dog250
  • dog250
  • 2011年12月10日 14:52
  • 5913

中缀改后缀表达式+计算器功能

  • 2013年12月30日 17:57
  • 1.07MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:把中缀表达式化为后缀表达式
举报原因:
原因补充:

(最多只允许输入30个字)