問題
#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;
}