#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NN 100
struct wq
{
 char x;  //值
 wq* link; //链接
};
//栈中元素个数
int all=0;
//入栈
void push(wq* me,char op);
//输出栈中元素
void display(wq* me);
//查找栈中元素的级别
int find(wq * me);
//找到尾指针
wq * set(wq * me);
void main()
{
 char a[NN];  // 定义一个数组接受输入
 cout<<"输入表达式:"<<endl;
 gets(a);
 int  low=222,high=0;  //标识运算符的级别
 wq * who = new wq;   //创建空栈
 who->link=NULL;
 for(int o=0;o<NN && a[o]!='\0';o++)  //遍历表到式
 {
  switch(a[o])
  {
  case '$':
   low =9;break;
  case '*':
  case '/':
   low = 7;break;
  case '+':
  case '-':
   low = 5;
   break;
  case '(':
   low=13;
   break;
  case ')':
   low=333;
   break;
  default:
   low = 222;
   break;
  };
  if(low==333)
  {
 display(who);
 low=find(who);
  }
  else if(low==222 || low<high || low==high)  //没有算术运算符 && 不为"("括号
  {
    cout<<a[o];
  }
  else
   {
    push(set(who),a[o]);
 if(low==13)
  high = 0;

 else
    high = low;
   }
 }
 display(who);
 cout<<"\t\t\t\ta"<<"\n";
 flushall();
 
  cout<<"\t\t\t\ta"<<"\n";
 flushall();
 flushall();
getchar();
}
//入栈
void push(wq* me,char op)
{
 me->link = new wq;
 me->link->x= op;
 me->link->link=NULL;
 all++;
}
//出栈
void display(wq* me)
{
 wq * here=me; //保存头指针    
 bool real=true;
 while(real)
 {
  me=here;  //还原头指针
  for(int p=0;p<all;p++)  
   me = me->link;    //防止产生出栈指针
  if(me->x=='('|| all==0)
  {
   real=false;
  }
  else
  { 
   cout<<me->x;
  }
  if(all!=0)
  free(me);
  all--;

 }
}
int find(wq * me)
{
 int num;
    for(int i=0;i<all;i++)
  me=me->link;
 switch (me->x)
 {
  case '$':
   num =9;break;
  case '*':
  case '/':
   num = 7;break;
  case '+':
  case '-':
   num = 5;
   break;
  default:
   num = 222;
   break;
 };
 return num;
}
//重置尾指针
wq * set(wq * me)
{
    for(int i=0;i<all;i++)
  me=me->link;
 me->link=NULL;
 return me;
}