#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Elemtype;
typedef struct {
 Elemtype  *base;
 Elemtype  *top;
 int stacksize;
}Sqstack;  //定义栈类型

Status Initstack(Sqstack &S){
 S.base=(Elemtype*)malloc(STACK_INIT_SIZE*sizeof(Elemtype));
 if(!S.base) exit(OVERFLOW);
 S.top=S.base;
 S.stacksize=STACK_INIT_SIZE;
 return OK;
}
Status Push(Sqstack &S,Elemtype e){
 if(S.top-S.base>=S.stacksize){
  S.base=(Elemtype*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(Elemtype));
  if(!S.base) exit(OVERFLOW);
  S.top=S.base+S.stacksize;
  S.stacksize+=STACKINCREMENT;
 }
 *S.top++=e;
 return OK;
}
Status Pop(Sqstack &S){
 int e;
 if(S.top==S.base)return ERROR;
 else {
 e=*--S.top;
 return (e);
 }
}
Status GetTop(Sqstack S){
 int e;
 if(S.top==S.base)return ERROR;
 e=*(S.top-1);
 return (e);
}

Status compare(char a,char b)
{
    if(b=='#')
        return '>';
    else{
        if((b=='(')&&(a==')'))
            return '=';
        else  
            return '>';
        if(b=='+')
            switch (a){
            case '+':
            case '-':
            case ')':return '<';break;
            default:return '>';break;
        }
        if(b=='-')
            switch (a){
            case '+':
            case '-':
            case ')':return '<';break;
            default:return '>';break;
        }
        if(b=='*')
            switch (a){
            case '(':return '>';break;
            default:return '<';break;
        }
        if(b=='/')
            switch (a){
            case '(':return '>';break;
            default:return '<';break;
        }
        if(b=='(')
            switch (a){
            case ')':return '=';break;
            default:return '>';break;
        }
    }
}
        
void Convert(char bds_hz[])
{
  int i=0,j=-1;
  char bds[20];
  Sqstack  OP;
  Initstack(OP);
  Push(OP,'#');
  while(bds_hz[i]!='#')
  {
   if(('0'<=bds_hz[i])&&(bds_hz[i]<='9'))
   {
       bds[++j]=bds_hz[i];i++;
   }
   else 
   {
    switch(compare(bds_hz[i],GetTop(OP)))
    {
    case '>':Push(OP,bds_hz[i]);i++;break;
    case '<':bds[++j]=Pop(OP);break;
    case '=':Pop(OP);i++;break;
    }
   }
  }
  bds[++j]='#';
  for(int k=0;k<=j;k++)
  {
      bds_hz[k]=bds[k];
  }
   
}
 
void main()
{
 char bds_hz[]="423*+42/-#";
 Convert(bds_hz);//将中缀变成后缀表达式
 int i=0,e;
 int x1,x2,temp;
    Sqstack OPND;
 Initstack(OPND);    //建立一个栈
 while (bds_hz[i]!='#')   //依次取得后缀表达式中的字符判断并操作
 {
  if (('0'<=bds_hz[i])&&(bds_hz[i]<='9') ){
   Push(OPND,bds_hz[i]-'0');
  } //如果是操作数,压栈
  else
  {//如果是操作符
   x2=Pop(OPND); //操作数2,出栈
 
   x1=Pop(OPND); //操作数1,出栈 
   
   //计算
   switch (bds_hz[i])
   {
   case '+':  temp=x1+x2;break;
   case '-':  temp=x1-x2;break;
   case '*':  temp=x1*x2;break;
   case '/':  temp=x1/x2;break;
   }
   Push(OPND,temp);  //计算结果压栈
  }
  i++;  //指针后移
 }
     e=GetTop(OPND);
 cout<<e<<endl;  //输出表达式结果
 
}
如果不要那个中缀变成后缀表达式的调用函数的话就结果正确,可是应该是调用的函数有问题才会让结果不对,不知道那个中缀变成后缀的调用函数哪里写错了,请哪个高手帮帮忙啊,无限感激。。。