问题
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
using namespace std;
typedef char ElemType;
typedef struct StackNode* StackLink;
struct StackNode{
ElemType data;
StackLink next;
};
//初始化
void InitStack(StackLink &S){
S = NULL;
return;
}
//入栈
void Push(StackLink &S, ElemType e){
StackLink p = (StackLink)malloc(sizeof(StackNode));
p->data = e;
p->next = S;
S = p;
return;
}
//出栈
void Pop(StackLink &S, ElemType &e){
e = S->data;
S = S->next;
return;
}
//返回栈顶元素
ElemType GetHead(StackLink S){
if (S == NULL)return 0;
return S->data;
}
//堆栈判空
bool StackEmpty(StackLink S){
if (S == NULL)return true;
return false;
}
//括号匹配的检验
bool Matching(){
StackLink S;
InitStack(S);
ElemType p;
cin >> p;
while (p!='#'){
if (p == '(' || p == '[')//遇左括号直接进栈
Push(S, p);
else if (p == ')' || p == ']'){//遇右括号判断
ElemType e = GetHead(S);
//若与当前栈顶的左括号类型相同则二者匹配,将栈顶的左括号出栈(相当于去括号)
if ((e == '('&&p == ')') || (e == '['&&p == ']'))
Pop(S, e);
//否则不匹配,返回错误
//不匹配有两种情况:1.类型不同;2.缺少左括号,若栈空栈顶元素返回的是0,必不匹配
else
return false;
}
cin >> p;
}
//如果栈非空,说明还有没匹配的括号,返回错误
if (!StackEmpty(S))return false;
return true;
}
int main(){
if (Matching())
printf("OK\n");
else
printf("WRONG\n");
system("PAUSE");
return 0;
}
括号匹配的检验
步骤:
1.遇左括号直接进栈
2.遇右括号判断
2.1若与当前栈顶的左括号类型相同则二者匹配,将栈顶的左括号出栈(相当于去括号)
2.2否则不匹配,返回错误
2.2注意:不匹配有两种情况:1.类型不同;2.缺少左括号,若栈空栈顶元素返回的是0,必不匹配
3.遇到结束符’#'循环结束,判断栈空,如果栈非空,说明还有没匹配的括号,返回错误
主函数:如果返回正确则正确匹配,否则失败
//括号匹配的检验
bool Matching(){
StackLink S;
InitStack(S);
ElemType p;
cin >> p;
while (p!='#'){
if (p == '(' || p == '[')//遇左括号直接进栈
Push(S, p);
else if (p == ')' || p == ']'){//遇右括号判断
ElemType e = GetHead(S);
//若与当前栈顶的左括号类型相同则二者匹配,将栈顶的左括号出栈(相当于去括号)
if ((e == '('&&p == ')') || (e == '['&&p == ']'))
Pop(S, e);
//否则不匹配,返回错误
//不匹配有两种情况:1.类型不同;2.缺少左括号,若栈空栈顶元素返回的是0,必不匹配
else
return false;
}
cin >> p;
}
//如果栈非空,说明还有没匹配的括号,返回错误
if (!StackEmpty(S))return false;
return true;
}