数据结构之栈应用:括号匹配实现
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
//链式栈实现括号匹配
using namespace std;
#define STACK_TYPE char //栈元素的类型是char
static int nodenum = 0;//记录栈初始化后的结点个数
typedef struct stacknode//数据结构
{
stacknode* next;
STACK_TYPE bracket;
}stacknode, *stack;
bool _empty(stack stack1)//空判断条件
{
if (stack1 == NULL)
return true;
else
return false;
}
void _pre_init(stack &stack1)//栈顶指针置空
{
stack1 = NULL;
}
void _push(stack &stack1,STACK_TYPE elem)//压一个入栈
{
stacknode* s;
s= (stacknode * )malloc(sizeof(stacknode));
s->bracket = elem;
s->next = stack1;
stack1 = s;
}
void push_init(stack &stack1)//初始化压栈
{
STACK_TYPE e;
cin >> e;
//nodenum++;
while (e != 'E')
{
_push(stack1, e);
cin >> e;
nodenum++;
}
}
STACK_TYPE _pop(stack &stack1)//栈顶出栈
{
if (!_empty(stack1))
{
stacknode* p = stack1;
STACK_TYPE bra = stack1->bracket;
stack1 = p->next;
free(p);
return bra;
}
}
void visitall(stack stack1)
{
stacknode* s1;
s1 = stack1;
while (s1 != NULL)
{
cout << s1->bracket << endl;
s1 = s1->next;
}
}
bool matching(STACK_TYPE b1, STACK_TYPE b2)//匹配原则,顺序和类型都要符合
{
int flag=0;
if (b1 == ')'&&b2 == '(')
flag = 1;
if (b1 == ']'&&b2 == '[')
flag = 1;
if (b1 == '}'&&b2 == '{')
flag = 1;
if (flag ==1)
return true;
else
return false;
}
bool judgenodenum(int num)//判断括号个数是否为偶数
{
if (num % 2 == 0)
return true;
else
return false;
}
void procedure(stack &stack1, stack &stack2)//匹配过程,第一个参数是匹配栈,第二个栈是存储栈
{
int number = nodenum;
if (judgenodenum(number) == false)
cout << "括号单数,无法匹配!" << endl;//判断括号个数是否为偶数
_push(stack1, _pop(stack2));//把存储栈的栈顶元素弹出压入匹配栈,第一次
while (!_empty(stack2))//当存储栈还有元素时
{
_push(stack1, _pop(stack2));//把存储栈的栈顶元素弹出压入匹配栈,循环
if (stack1->next != NULL)//当stack1栈顶下的一个元素存在时(即存在两个元素以上时)
{
if (matching(stack1->bracket, stack1->next->bracket) == true)//判断匹配
cout << "match_success " << _pop(stack1) << " and " << _pop(stack1) << endl;//成功即输出
}
}
}
int main()
{
stack stackload;//存储栈
stack stackmatch;//匹配栈
cout << "存储栈初始化(按倒序输入)" << endl;
_pre_init(stackload);
_pre_init(stackmatch);//栈顶指针置空
push_init(stackload);//存储栈初始化
//visitall(stackload);
procedure(stackmatch, stackload);//开始匹配
}
运行结果