主题:请高手帮帮忙,中缀变成后缀表达式出了问题
#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; //输出表达式结果
}
如果不要那个中缀变成后缀表达式的调用函数的话就结果正确,可是应该是调用的函数有问题才会让结果不对,不知道那个中缀变成后缀的调用函数哪里写错了,请哪个高手帮帮忙啊,无限感激。。。
#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; //输出表达式结果
}
如果不要那个中缀变成后缀表达式的调用函数的话就结果正确,可是应该是调用的函数有问题才会让结果不对,不知道那个中缀变成后缀的调用函数哪里写错了,请哪个高手帮帮忙啊,无限感激。。。