算法整体思想
封装好栈的基本操作:初始化,出栈,入栈,判断栈空。用字符数组存储用户输入的括号系列,遍历数组,如果是左括号就入栈,否则就弹出栈顶元素,将弹出的元素与该括号进行判断,若匹配则扫描下一个括号,如果匹配失败,算法结束,提示失败。扫描完所有字符后,如果栈非空,说明匹配失败。
编码实现
定义栈
typedef struct LNode{
char data;
struct LNode *next;
}*LiStack;
初始化
void InitLiStack(LiStack &L){
L=(LNode *)malloc(sizeof(LNode));
L=NULL;
}
出栈
bool Pop(LiStack &L,char &x){
if(L==NULL)
return false;
x=L->data;
LNode *p=L;
L=L->next;
free(p);
return true;
}
入栈
bool Push(LiStack &L,char x){
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->data=x;
s->next=L;
L=s;
return true;
}
完整代码
#include <iostream>
#include "stdlib.h"
using namespace std;
#define InitSize 10
typedef struct LNode{
char data;
struct LNode *next;
}*LiStack;
void InitLiStack(LiStack &L){
L=(LNode *)malloc(sizeof(LNode));
L=NULL;
}
bool StackEmpty(LiStack L){
if(L==NULL)
return true;
else
return false;
}
bool Push(LiStack &L,char x){
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->data=x;
s->next=L;
L=s;
return true;
}#include <iostream>
#include "stdlib.h"
using namespace std;
#define InitSize 10
typedef struct LNode{
char data;
struct LNode *next;
}*LiStack;
void InitLiStack(LiStack &L){
L=(LNode *)malloc(sizeof(LNode));
L=NULL;
}
bool StackEmpty(LiStack L){
if(L==NULL)
return true;
else
return false;
}
bool Push(LiStack &L,char x){
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->data=x;
s->next=L;
L=s;
return true;
}
bool Pop(LiStack &L,char &x){
if(L==NULL)
return false;
x=L->data;
LNode *p=L;
L=L->next;
free(p);
return true;
}
int main() {
LiStack L;
InitLiStack(L);
char c[InitSize];
int i=0,j=0;
char x,temp;
bool flag;
cout<<"输入括号序列,以空格隔开,以‘#’结束"<<endl;
cin>>x;
while(x!='#'){
c[i++]=x;
cin>>x;
}
for (j; j < i; ++j) {
if(c[j]=='(' || c[j]=='[')
Push(L,c[j]);
if(c[j]==')'){
flag=Pop(L,temp);
if(temp!='('){
cout<<"栈顶元素为:"<<temp<<endl;
cout<<"括号匹配失败"<<endl;
return 0;
}
}
if(c[j]==']'){
flag=Pop(L,temp);
if(temp!='['){
cout<<"栈顶元素为:"<<temp<<endl;
cout<<"括号匹配失败"<<endl;
return 0;
}
}
}
if(StackEmpty(L) && flag)
cout<<"匹配成功!"<<endl;
else
cout<<"匹配失败!"<<endl;
return 0;
}
运行截图
总结
如果左括号多于右括号,数组遍历完毕后,栈非空------失败
如果右括号多于左括号,数组遍历完毕后,最后一次必为出栈操作且出栈失败----失败