栈是一种先进后出的结构,它在程序设计中有很多的应用,今天咱们介绍一下栈应用于括号匹配的问题
有一行括号序列输入数据是一个字符串S(S的长度小于100,且S不是空串),数据保证S中只含有”[“,”]”,”(“,”)”四种字符
如果字符串中所含的括号是配对的,则输出YES!,如果不配对则输出NO!
分析:
首先咱们先将输入的字符串输入到一个字符数组中,然后依次入栈,若下一次输入的括号刚好能和栈顶的括号匹配,则将栈顶的元素出栈,若本次输入的括号和栈顶元素不匹配则将本次元素入栈。
最后检查栈是否为空,如果栈是空的则说明括号匹配,如果非空则括号不匹配。
#include<iostream>
using namespace std;
#include<assert.h>
#define SIZE 100
typedef struct stack //定义一个栈
{
int size; //栈的容量
char* arr; //存储数据的容器
int top; //栈顶
}stack;
void init(stack* p) //栈的初始化
{
p->size=SIZE;
assert((p->arr=(char*)malloc(SIZE))!=NULL); //为容器分配大小
p->top=0;
}
void push(stack* p,char c)
{
assert(p->top!=p->size); //此处使用了断言(assert的头文件为assert.h)
p->arr[p->top++]=c;
}
void pop(stack* p)
{
assert(p->top!=0);
p->top--;
}
void input(stack* p)
{
char arr[SIZE];
cin>>arr; //输入待检测的括号串
int i=0;
p->arr[p->top++]=arr[i++];
while(arr[i]!='\0')
{
if((arr[i]==')'&&p->arr[p->top-1]=='(')||(arr[i]==']'&&p->arr[p->top-1]=='['))
{
pop(p); //若待入栈的和栈顶元素匹配,放弃入栈,并将栈顶元素出栈
}
else
push(p,arr[i]); //若不匹配,则正常入栈
i++;
}
}
void check(stack* p) //检测栈是否为空,并输出结果
{
if(p->top==0)
cout<<"YES!"<<endl;
else
cout<<"NO!"<<endl;
}
int main()
{
stack p; //创建一个栈
init(&p); //将栈初始化
input(&p); //前面分析部分的代码实现
check(&p); //判断栈是否为空
}
放截图给大家看看吧