这是实现链栈的各种基本运算的算法:
#include <iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef char ElemType;
//声明链栈的类型
typedef struct linknode{
ElemType data;
struct linknode* next;
}LinkStNode;
//初始化栈
void InitStack(LinkStNode *&s){
s=(LinkStNode*)malloc(sizeof(LinkStNode));
s->next=NULL;
}
//销毁栈
void DestroyStack(LinkStNode *&s){
LinkStNode *pre=s,*p=s->next;
for(;p->next!=NULL;p=p->next){
free(pre);
pre=p;
}
free(pre);
}
//判断栈是否为空
bool StackEmpty(LinkStNode *s){
return s->next==NULL;
}
//元素e进栈
void Push(LinkStNode *&s,ElemType e){
LinkStNode *p;
p=(LinkStNode*)malloc(sizeof(LinkStNode));
p->data=e;
p->next=s->next;
s->next=p;
}
//元素出栈,存在e中
bool Pop(LinkStNode *&s,ElemType &e){
LinkStNode *p;
if(s->next==NULL)return false;
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return true;
}
//得到栈顶元素,存在e中
bool GetTop(LinkStNode *s,ElemType &e){
if(s->next==NULL)return false;
e=s->next->data;
return true;
}
//判断输入的表达式中括号是否配对的算法
bool Match(const ElemType* exp){
bool flag=true;
ElemType e;
LinkStNode* s;
InitStack(s);
for(int i=0;exp[i]!='\0'&&flag;i++){
// cout<<exp[i]<<endl;
if(exp[i]=='(') Push(s,exp[i]);
else if(exp[i]==')'){
if(GetTop(s,e)==true){
if(e!='(') {flag=false;}
else Pop(s,e);
}
else {flag=false;}
}
}
if(!StackEmpty(s))flag=false;
return flag;
}
int main() {
ElemType a[]="a(12was(scxz))sdasd";
// cout<<a<<endl;
if(Match(a))cout<<"yes";
else cout<<"no";
/* LinkStNode* s;
InitStack(s);
for(int i=0;i<strlen(a);i++)Push(s,a[i]);
for(int i=0;i<strlen(a);i++)Pop(s,a[i]);
cout<<a<<endl;
*/ return 0;
}
有不对的地方,请多多指教,谢谢。