括号匹配问题(手写栈程序)
利用栈的后进先出的特性,将所有的左括号( ( , [ , {)压入栈中,如果遇到右括号,则弹出栈顶元素
代码实现如下:
#include <bits/stdc++.h>
#define MaxSize 10
using namespace std;
//声明一个栈
typedef struct {
char data[MaxSize];
int top;
}SqStack;
//初始化栈
void InitStack(SqStack &S)
{
S.top = -1;
}
//判断栈是否为空
bool StackEmpty(SqStack S){
if(S.top == -1)
return true;
else
return false;
}
//进栈操作
bool Push(SqStack &S, char x){
if(S.top==MaxSize-1){
return false;
}
S.top = S.top + 1;
S.data[S.top] = x;
return true;
}
//出栈操作
bool Pop(SqStack &S, char &x){
if(StackEmpty(S)){
return false;
}
x = S.data[S.top--];
return true;
}
//匹配方法
bool bracketCheck(char str[], int length){
SqStack S;
InitStack(S);
for(int i = 0; i < length; i++){
if(str[i] == '(' || str[i] == '[' || str[i] == '{'){
Push(S,str[i]);//遇到左括号就进栈
}
else{//否则弹出栈顶元素
if(StackEmpty(S))//如果栈中没有元素
return false;
char topElem;
Pop(S,topElem);//弹出栈顶元素,返回栈顶元素的值
if(str[i] == ')' && topElem != '(')
return false;
if(str[i] == ']' && topElem != '[')
return false;
if(str[i] == '}' && topElem != '{')
return false;
}
}
return StackEmpty(S);
}
int main(){
char str[10];
for(int i = 0; i < 10; i++){
cin >> str[i];
}
if(bracketCheck(str,10))
cout << "匹配成功" << endl;
else
cout << "匹配失败" << endl;
return 0;
}