我看了一下,大部分的使用的是顺序栈,我用链栈来试一试
如果有问题欢迎留言
#include <iostream>
#include <cstdlib>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#include <cstring>
#include<cstdio>
typedef struct linknode{
char data;
struct linknode *next;
}stack,*listack;
bool initstack(listack &s){ //初始化一个栈
s=(stack *)malloc(sizeof(stack));
s->next = NULL; //注意=和==
return true;
}
bool push(listack &s,char e){ //栈的压入操作
stack *top;
top=(stack *)malloc(sizeof(stack));
top->data=e;
top->next=s->next;
s->next=top;
return true;
}
bool pop(listack &s,char &e){ //栈的取出操作,这里要用到引用符号
if(s->next!=NULL){
stack *p;
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return true;
}
if(s->next == NULL){
return false;
}
}
void printstack(listack s){ //打印栈函数,如果不用可删掉
stack *p;
p=s->next;
while(p != NULL){
cout<<p->data<<" ";
p=p->next;
}
}
bool stackempty(listack s){ //判断当前的栈是否为空
if(s->next==NULL)
return true;
else
return false;
}
string str;
char topelem; //从栈中取出来的那个元素,方便后续比较
int tag=1; //标记位,如果位1则匹配,反之不匹配
int main(int argc, char** argv) {
listack s;
initstack(s);
cin>>str;
int n=str.length();
for(int i=0; i<n ;i++){
if(str[i]=='('||str[i]=='['){ //如果是左括号则压入栈中
push(s,str[i]);
}
else{
if(stackempty(s)) //如果栈中的左括号已经匹配完了,但仍然有右括号需要左括号来匹配
{
tag=0;
break;
}
pop(s,topelem); //取出最近存储的那个左括号
if(str[i]==')'&&topelem!='(') //比较
tag=0;
if(str[i]==']'&&topelem!='[') //比较
tag=0;
}
}
if(tag==1 && stackempty(s)==1) //右括号比较完了但是栈里存在还没匹配的左括号
tag=1;
if(tag==1 && stackempty(s)==0)
tag=0;
cout<<tag;
// cout<<"\n";
// cout<<s->next->data;
// printstack(s); cout<<stackempty(s);
return 0;
}
*/