以下程序用于将中缀表达式转换为postfix,但它产生输入字符串作为输出,即程序没有给出后缀表达式作为输出。 请解释代码有什么问题。
#include<iostream.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct stack{
int top;
unsigned capacity;
char *arr;
};
void push(struct stack * stk,char data){
if(stk->top != stk->capacity-1)
stk->arr[++stk->top]=data;
}
char pop(struct stack* stk){
if(stk->top!= -1){
char c = stk->arr[stk->top];
stk->top--;
return c;
}
}
int priority(char c){
switch(c){
case '+': return 1;
case '-': return 1;
case '*': return 2;
case '/': return 2;
case '^': return 3;
}
}
void intopostfix(char * ch){
struct stack *stk = (struct stack*)malloc(sizeof(struct stack));
stk->top=-1;
stk->capacity = strlen(ch);
if(!stk){cout<<"stack not created";}
int i,k;
for(i=0,k=-1; ch[i] ; ++i){
if((ch[i]>='a' && ch[i]<='z')||(ch[i]>='A' && ch[i]<='Z') ){
ch[++k]=ch[i];
}
else if(ch[i]=='('){
push(stk,ch[i]);
}
else if(ch[i]==')'){
while((stk->top!=-1)&& (ch[i]!='('))
{
ch[++k]=pop(stk);
//k++;
}
}
else{
while((stk->top!=-1)&&(priority(ch[i])<=priority(stk->arr[stk->top]))){
ch[++k]=pop(stk);
}
push(stk,ch[i]);
}
while(stk->top!=-1){
ch[++k]=pop(stk);
//k++;
}
}
for(i=0;ch[i]!='\0';i++)
cout<<ch[i];
}
int main(){
clrscr();
char exp[]="a+b*(c^d-e)^(f+g*h)-i";
intopostfix(exp);
getch();
return 0;
}
程序输出与输出相同的字符串即 A + B *(C ^ d-e)中^(F + G * H)-i
答案 0 :(得分:0)
需要进行以下更改
最后一个while语句需要移出for循环。这需要在处理所有令牌后完成。请参阅此处的算法http://interactivepython.org/runestone/static/pythonds/BasicDS/InfixPrefixandPostfixExpressions.html
输出应写入单独的变量
需要在switch语句
默认:返回0;
stk-&gt; arr =(char *)malloc(500);
还需要进行其他细微更改。
以下是代码的修改部分
int priority(char c){
switch(c){
case '+': return 1;
case '-': return 1;
case '*': return 2;
case '/': return 2;
case '^': return 3;
default : return 0;
}
}
void intopostfix(char * ch){
struct stack *stk = (struct stack*)malloc(sizeof(struct stack));
//struct stack *stk = (struct stack*)malloc(500);
stk->arr = (char *)malloc(500);
stk->top=-1;
stk->capacity = strlen(ch);
char postFixStr [500];
if(!stk){cout<<"stack not created";}
int i,k;
for(i=0,k=-1; ch[i] ; ++i){
if((ch[i]>='a' && ch[i]<='z')||(ch[i]>='A' && ch[i]<='Z') ){
postFixStr[++k]=ch[i];
}
else if(ch[i]=='('){
push(stk,ch[i]);
}
else if(ch[i]==')'){
while((stk->top != -1)&& (stk->arr[stk->top] != '('))
{
postFixStr[++k]=pop(stk);
//k++;
}
pop(stk);
}
else{
while((stk->top!=-1)&&(priority(ch[i])<=priority(stk->arr[stk->top]))){
postFixStr[++k]=pop(stk);
}
push(stk,ch[i]);
}
}
while(stk->top!=-1){
postFixStr[++k]=pop(stk);
//k++;
}
postFixStr[++k] = '\0';
//for(i=0;ch[i]!='\0';i++)
//cout<<ch[i];
cout<<postFixStr << endl;
}