-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpair.cpp
More file actions
78 lines (60 loc) · 1.43 KB
/
Copy pathpair.cpp
File metadata and controls
78 lines (60 loc) · 1.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
//栈大小
#define stackSize 10000
using namespace std;
// 判断输入字符是否为左括号
bool isLeft(char c);
// 判断输入字符是否为右括号
bool isRight(char c);
// 获取右括号对应的左括号
char getSignal(char c);
// 判断是否匹配
bool judge(char* statement);
int main(){
char statement[stackSize];
while(cin>>statement){
// 空行退出
if(statement[0] == '\0')break;
if(judge(statement)) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
bool judge(char* statement){
char stack[stackSize];// 栈大小
int top = 0;// 栈顶
for(int i=0;statement[i]!='\0';i++){
if( isLeft(statement[i]) ){
// 栈溢出
if(top==stackSize-1) return false;
// 入栈
stack[top++]= statement[i];
} else if( isRight(statement[i]) ){
// 当前右括号对应的左括号
char signal = getSignal(statement[i]);
// 栈越界
if(top==0) return false;
// 左右匹配成功,出栈
else if(stack[top-1] == signal) top-- ;
// 匹配错误
else return false;
}
}
// 循环结束,栈已空,匹配成功
if(top==0) return true;
// 循环结束,栈非空,匹配失败
return false;
}
bool isLeft(char c){
return c=='(' || c=='[' || c=='{';
}
bool isRight(char c){
return c==')' || c==']' || c=='}';
}
char getSignal(char c){
switch(c){
case ')':return '(';
case ']':return '[';
case '}':return '{';
}
}