//括号匹配
/*算法思想:
**若是左括号,入栈,若是右括号,则出栈一个左括号判断是否与之匹配;
**检验栈是否为空,只有栈空,整个字符串才是括号匹配的。
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define ElemType char
using namespace std;
typedef struct SNode{
ElemType data;
struct SNode *next;
}SNode,*SLink;
typedef struct {
SLink top;
int count;
}Stack;
//初始化栈
void InitStack(Stack &s);
//入栈操作
bool Push(Stack &s,ElemType e);
//出栈操作
bool Pop(Stack &s,ElemType &e);
//判断栈是否为空
bool Empty(Stack s);
//判断函数
bool Check(char *str);
int main(void)
{
char str[20];
char c;
printf("请输入要判断的字符串,以#号结束\n");
int i = 0;
scanf("%s",str);
bool result = Check(str);
if(result)
{
printf("匹配成功!");
}
else
{
printf("匹配失败!");
}
return 0;
}
//判断函数
bool Check(char *str)
{
Stack s;
InitStack(s); //初始化
int len = strlen(str); //获取字符串的长度,用来遍历字符串
ElemType e;
for(int i = 0;i<len;i++)
{
char a = str[i];
switch(a)
{
case '(':
case '[':
Push(s,a);
break;
case ')':
if(Pop(s,e))
{
if(e!='(')
{
return false; //出栈的元素与循环中的元素不匹配
}
}
else
{
return false;
}
break;
case ']':
if(Pop(s,e))
{
if(e!='[')
{
return false;
}
}
else
{
return false;
}
break;
}
}
if(Empty(s))
{
return true; //如果队列为空,则说明完全匹配成功
}
else
{
return false;
}
}
//初始化栈
void InitStack(Stack &s)
{
SLink p = (SLink)malloc(sizeof(SNode));
p->next = NULL;
s.top = p; //头节点
s.count = 0;
}
//入栈操作
bool Push(Stack &s,ElemType e)
{
SNode *p = (SNode*)malloc(sizeof(SNode));
p->data = e;
p->next = s.top->next;
s.top->next = p;
s.count++;
return true;
}
//出栈操作
bool Pop(Stack &s,ElemType &e)
{
if(s.count==0)
{
return false;
}
SNode *p = s.top->next;
e = p->data;
s.top->next = p->next;
s.count--;
free(p);
return true;
}
//判断栈是否为空
bool Empty(Stack s)
{
if(s.count==0)
{
return true;
}
else
{
return false;
}
}
数据结构与算法(10)--栈的应用-括号匹配
最新推荐文章于 2023-04-25 18:43:57 发布