大家好!我是C ++的新手(也是stackoverflow中的新手),我需要专家的帮助。即使没有错误或警告,此代码也有问题。它只是在程序执行时挂起。
该程序使用链接列表(堆栈)将中缀转换为后缀。
# include <iostream>
# include <cstring>
using namespace std;
struct node {
char data;
node *next;
};
node *top=NULL;
node *bottom=NULL;
node *entry;
node *last_entry;
node *second_last_entry;
void push(const char Symbol) {
entry=new node;
if(bottom==NULL) {
entry->data=Symbol;
entry->next=NULL;
bottom=entry;
top=entry;
}
else {
entry->data=Symbol;
entry->next=NULL;
top->next=entry;
top=entry;
}
}
const char pop( ) {
char Symbol=NULL;
if(bottom==NULL)
cout<<"\n\n\n\t *** Error : Stack is empty. \n"<<endl;
else {
for (last_entry=bottom; last_entry->next!=NULL; last_entry=last_entry->next)
second_last_entry=last_entry;
if(top==bottom)
bottom=NULL;
Symbol=top->data;
delete top;
top=second_last_entry;
top->next=NULL;
}
return Symbol;
}
void infix_to_postfix(const char *Infix) {
char Infix_expression[100]={NULL};
char Postfix_expression[100]={NULL};
strcpy(Infix_expression,"(");
strcat(Infix_expression,Infix);
strcat(Infix_expression,")");
char Symbol[5]={NULL};
char Temp[5]={NULL};
for(int count=0;count<strlen(Infix_expression);count++) {
Symbol[0]=Infix_expression[count];
if(Symbol[0]=='(')
push(Symbol[0]);
else if(Symbol[0]==')') {
Symbol[0]=pop( );
while(Symbol[0]!='(')
{
strcat(Postfix_expression,Symbol);
Symbol[0]=pop( );
}
}
else if(Symbol[0]=='^' || Symbol[0]=='*' || Symbol[0]=='/'
|| Symbol[0]=='+' || Symbol[0]=='-')
{
if(Symbol[0]=='*' || Symbol[0]=='/')
{
Temp[0]=pop( );
while(Temp[0]=='^' || Temp[0]=='*' || Temp[0]=='/')
{
strcat(Postfix_expression,Temp);
Temp[0]=pop( );
}
push(Temp[0]);
}
else if(Symbol[0]=='+' || Symbol[0]=='-')
{
Temp[0]=pop( );
while(Temp[0]!='(')
{
strcat(Postfix_expression,Temp);
Temp[0]=pop( );
}
push(Temp[0]);
}
push(Symbol[0]);
}
else
strcat(Postfix_expression,Symbol);
}
cout<<"\n\n Postfix Expression : "<<Postfix_expression;
}
int main( ) {
char Infix_expression[100]={NULL};
cout<<"\n\n Enter the Infix Expression : ";
cin>>Infix_expression;
infix_to_postfix(Infix_expression);
return 0;
}
请帮帮我!我是新手,没有你们,我不能走远。非常感谢你!
答案 0 :(得分:1)
我想您需要的帮助是学习如何使用该IDE调试代码。您可以尝试的第一件事是添加更多打印(通过cout
)以更清楚地查看更新的内容并找到程序挂起的位置(或者它是否陷入无限循环)。
Here是一个教程,展示如何使用代码块进行调试。遗憾的是,我不知道这是否符合您的配置。
答案 1 :(得分:1)
对于堆栈,您只需要一个堆栈指针。
void push(const char Symbol) {
entry = new node;
entry->data = Symbol;
entry->next = top;
top = entry;
}
const char pop( ) {
if (!top) {
cout << "\n\n\n\t *** Error : Stack is empty. \n" << endl;
return ' ';
}
node* entry = top;
top = top->next;
char ch = entry->data;
delete entry;
return ch;
}
const bool is_empty() {
return !top;
}
那应该解决一些错误,但可能不是全部。有时我看到两个堆栈完成了同样的事情:一个用于操作符,一个用于操作数。我不一定建议。而是从零开始,并保持算法简单和抽象,可能首先在伪代码中。