我必须制作一个代码,检查括号是否使用堆栈和链接列表进行平衡。 这是我的代码,我使用了我班上的许多教程和power point演示文稿,并且还得到了我朋友的一些帮助。 但是,任何人都可以解释在“流行音乐”下发生的事情。和'检查'零件,逐行(我把它作为评论部分,我不明白)?我对理解c ++的这一部分(已实现的堆栈和l.lists)有疑问,而且我没有能够解释它并且有时间的人。我尝试过很多东西,但我真的不明白。 附:代码可以正常工作 谢谢你们!
#include<iostream>
#include <string>
using namespace std;
struct node
{
char data;
node *link;
};
int pop(node *&stack) //node that points to address of a stack?
{
char result;
node *top=new node; //how can i explain this?
top=stack; //why are we equalizing top with stack?
result=top->data;//i dont understand
stack=top->link;//dont understand
delete top;
return result;
}
bool Pairs(char openP,char closedP)
{
if(openP == '(' && closedP == ')') return true;
else if(openP == '{' && closedP == '}') return true;
else if(openP == '[' && closedP == ']') return true;
else return false;
}
bool Check(string exp)
{
int i=0;
node *stack=NULL;
while(exp[i])
{
if(exp[i]=='(' || exp[i]=='[')
{
node *neww=new stack;//dont understand
neww->data=exp[i];//dont understand
neww->link=stack; //-II-
stack=neww; //-II-
}
if(exp[i]==')' || exp[i]==']')
{
if(stack==NULL)
return 0;
else if (Pairs(pop(stack), exp[i])==0) //what does mean this part in parentheses?
return 0;
}
i++;
}
if(stack==NULL)
return 1;
else
return 0;
}
int main()
{
string exp;
cout<<"Enter parentheses:\n";
cin>>exp;
if(Check(exp)!=0)
cout<<"P. are balanced";
else
cout<<"P. are not balanced";
return 0;
}
答案 0 :(得分:0)
我建议采用以下方法:
考虑一下忽略语言细节的算法。堆栈是正确的方法,但在您考虑算法之前,您不需要考虑如何实现堆栈。
决定你需要一个给定的数据结构,在发明自己的数据结构之前,先问问自己是否已经存在于C ++(std :: stack)中。
使用C ++习语不是C语言(即使用迭代器begin()和end()而不是索引)除了其他任何东西,这将阻止你的exp [i] bug。
没有一个班级不止一件事。如果需要堆栈,则创建堆栈类,而不是让您的解析类涉及堆栈实现。首先,它更容易考虑检查算法,其次堆栈类可以在其他地方重复使用。
概括地说,您的解决方案将使用迭代器检查字符串的字符,并使用a来推送和弹出开括号 的的std ::堆栈&LT;炭&GT; 即可。 新或指针无需任何地方。