标题:原创中缀变后缀(十以内数)
只看楼主
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
 问题点数:0 回复次数:4 
原创中缀变后缀(十以内数)

这是我写的中缀变后缀,输出函数有问题,求助,帮忙改一下,每次输完后缀总多一些莫名其妙的符号,这是为什么呢?输出顺序没有问题! #include "iostream.h" #include "stdio.h" #include "stdlib.h" #include "conio.h" #define MAXSIZE 50 #define MAXSIZECREMENT 20 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define NULL 0

typedef struct{ char *base; char *top; int stacksize; }sqstack;

Initstack(sqstack s) { s.base=(char *)malloc(MAXSIZE * sizeof(char)); if(!s.base) exit(OVERFLOW); s.top=s.base; s.stacksize=MAXSIZE; return OK; }

stackempty(sqstack s) {return(s.top==NULL);}

Gettop(sqstack s,char &e)---------返回e,但不改变top指针 { if(s.top>s.base) e=*s.top; return e;

}

Push(sqstack &s,char e)--------------进栈 { /* if(s.top-s.base=s.stacksize); { s.base=(char *).realloc((*s).base,((*s).stacksize+MAXSIZECREMENT)*sizeof(char)); if(!(s.base) exit(OVERFLOW); s.top=s.base+s.stacksize; s.stacksize+=MAXSIZECREMENT; } */------------------增加空间这段有问题,请改!!!! *(++s.top)=e; return OK; }

Pop(sqstack &s,char &e)------------出栈 { if(s.top==s.base) return ERROR; e=*(s.top--); return OK; }

int Proceed(char &ch1 ,char &ch2)----------判断函数优先级,1高,0低,2是相同 { switch(ch1) { case '@': return 1; case '+': case '-': if(ch2=='*'||ch2=='/') return 1; else return 2;

case '*': case '/': if(ch2=='(') return 1; else return 0; case '(': return 1; default : break;

} return OK; }

Transfer(sqstack &s1) { char ch,e; sqstack R; Initstack(R); Push(R,'@'); cout<<"input string compute:"; cin>>ch; while(ch!='@') { switch(ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': Push(s1,ch);break;

case '(': Push(R,ch);break;

case ')': while(Gettop(R,e)!='(') { Push(s1,Gettop(R,e)); Pop(R,e); } Pop(R,e);----------------------左括号出栈 break;

default : if ((Proceed(Gettop(R,e),ch)==1)) Push(R,ch);--------------高 else { if ((Proceed(Gettop(R,e),ch)==0)) Push(s1,ch);--------------低 else { Push(s1,Pop(R,e));continue;}---------相等后这个输入元素继续和下一个栈头元素再判断优先级,是这个意思,但不知道写的对不对? !!! } break; } cin>>ch;

}

Push(s1,Pop(R,e));----------------最后一个字符入栈S1 return OK; }

display(sqstack s)-------这个函数有问题,因为输完后不停继续输出乱码,并且如果象我写的这样输出是逆序,请帮忙写个从栈底输出的函数!!!!!!!:) { char e; while(!stackempty(s)) { Pop(s,e); printf("%c",e); } }

main() { clrscr(); sqstack s; Initstack(s); Transfer(s); display(s);

}

[此贴子已经被作者于2005-10-6 12:51:07编辑过]

搜索更多相关主题的帖子: 后缀 define include char 
2005-10-06 11:44
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
得分:0 
int Proceed(char &ch1 ,char &ch2) 这个是判断函数优先级,如果ch2比ch1优先级高则return1,否则return 0;

2005-10-06 11:59
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
得分:0 
Transfer(sqstack &s1) 如果输入的是0-9个数,则放入S1栈 如果输入的是字符,则 1.若是( 则直接入栈R 2.若是 )则弹出栈R内字符直至遇到 ) 3 若是 其他字符,则判断 *R.top字符与输入字符ch的优先级在proceed(ch1,ch2)函数里 a.若ch优先级高,则入栈R b.若ch优先级低,则入栈S1 c.若优先级相等,则把R里的栈头符号进S1,并将输入元素继续和下一个栈头符号比较优先级。。。。 4,输入@程序终止

[此贴子已经被作者于2005-10-6 12:51:55编辑过]


2005-10-06 12:07
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
得分:0 
你那个判断优先级的其实可以只用一个参数 例如你   if (procced(gettop()) &gt; procced( ch)) { } else{} 就可以不用那么麻烦 了

还有,你用while( ch&gt; '0' &amp;&amp; ch &lt;'9'){}就可以输入9以上的数字了

关于你那个重新分配内存的问题,你可以先复制你原来栈的内容,然后再用free来释放,再用malloc来重新分配,再把复制的内容压进去,然后再压新的内容看看可不可以,C++里面我就是用这样的方法,不过是用new来分配,delete来释放

c++/C + 汇编 = 天下无敌
2005-10-07 23:01
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
得分:0 
你输出的时候你可以
void display( sqtack s)
{
printf("%d",*(s.top));
s.top++;
}

c++/C + 汇编 = 天下无敌
2005-10-07 23:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-29394-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050578 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved