/***链栈实现括号匹配***/
#include<iostream>
#include<string.h>
using namespace std;
#define OK 1
#define ERROR 0
typedef char SElemType;
typedef int Status;
typedef struct SNode {//定义链栈
SElemType data;
struct SNode* next;
} SNode, *LinkStack;
Status InitStack(LinkStack &S) {//初始化链栈
S = NULL;
return OK;
}
bool StackEmpty(LinkStack &S) { //判断栈是否为空
if (S == NULL)
return ERROR;
else
{
return OK;
}
}
Status Push(LinkStack &S, SElemType &e) {
LinkStack p;
p = new SNode;
p->data = e;
p->next = S;
S = p;
return OK;
}
Status Pop(LinkStack &S, SElemType &e) {
LinkStack p;
StackEmpty(S);
p = S;
S = S->next;
e = p->data;
delete p;
return OK;
}
Status GetTop(LinkStack& S) {//取栈顶元素
if (S != NULL)
return S->data;
}
//算法3.21 括号的匹配
Status Matching() {//检验表达式中所含括号是否正确匹配,如果匹配,则返回true,否则返回false
LinkStack S;
SElemType x;
InitStack(S);//初始化空栈
int flag = 1;//标记匹配结果以控制循环及返回结果
char ch;
cin >> ch;//读入第一个字符
while(ch!= '#' && flag)//假设表达式以‘#’结尾
{
cout << ch;
switch (ch)
{
case '[':
case '(':
Push(S, ch);
break;
case ')':
if (StackEmpty(S) && GetTop(S) == '(')
Pop(S, x);
else flag = 0;
break;
case ']':
if (StackEmpty(S) && GetTop(S) == '[')
Pop(S, x);
else flag = 0;
break;
}
cin >> ch;//继续读入下一个字符
}
if (!StackEmpty(S) && flag) return true ;
else return false;
}
int main() {
cout << "请输入待匹配的表达式,以“#”结束:" << endl;
//int flag=0;
bool a=Matching();
if (a)
cout << "括号匹配成功!" << endl;
else
cout << "括号匹配失败!" << endl;
return 0;
}
灯塔——C++链栈实现括号匹配
最新推荐文章于 2024-08-03 18:36:56 发布