1028. 语句匹配
Description
Pascal语言中,复合语句用begin...end表示,条件语句用if...then...else...表示,其中,else子句可以出现也可以不出现。现在提取出一些语句中的所有begin、end、if、then、else,编写一个程序检查它们能否匹配,以构成若干条合法的语句。
Input Format
输入包含两行。
第1行:一个整数N,表示接下来有N个字符串将读入。
第2行:包含N个字符串,每个字符串一定是{"begin","end","if","then","else"}之一(不包括引号)。这些字符串表示从一系列语句中依次提取出的所有元素。
Output Format
若输入可以构成若干条合法语句,输出一行"YES",否则输出一行"NO"。(不包含引号)
Sample Input
9
if then begin if then begin end end else
Sample Output
YES
Sample Input
4
if begin end then
Sample Output
NO
说明
N≤100N≤100
注意begin...end不能作为判断条件。(见样例2)
注意then与else之后都允许出现不止一条if语句或复合语句。
#include <iostream>
#include <string.h>
using namespace std;
int main(){
int n;
cin>>n;
string str[n];
for(int i=0;i<n;++i)
cin>>str[i];
int stack[n+1];
int top = 0;
stack[0] = -1;
bool flag = true;
for(int i=1;i<=n;++i)
stack[i] = 0;
for(int i=0;i<n;++i){
if(str[i].compare("if") == 0){
top++;
stack[top] = 1;
}else if(str[i].compare("then") == 0){
if(stack[top]!=1){
flag = false;
break;
}else{
stack[top] = -1;
}
top++;
stack[top] = 2;
}else if(str[i].compare("else") == 0){
if(stack[top]==1){
flag = false;
break;
}
int j;
for(j=i ; stack[j] != 2 && j>=0 ; --j){
if(stack[j] == 3){
flag = false;break;
}
}
if(!flag)
break;
if(j==-1){
flag = false;
break;
}else{
stack[j] = -1;
top++;
stack[top] = -1;
}
}else if(str[i].compare("begin") == 0){
if(stack[top] == 1){
flag = false;
break;
}else{
top++;
stack[top] = 3;
}
}else if(str[i].compare("end") == 0){
if(stack[top] == 1){
flag = false;
break;
}
int j;
for(j=i ; stack[j] != 3 && j>=0; --j);
if(j==-1){
flag = false;
break;
}else{
stack[j] = -2;
top++;
stack[top] = -2;
}
}
}
// for(int i=1;i<=n;++i)
// cout<<stack[i]<<" ";
for(int i=1;i<=n;++i)
if(stack[i] == 3 || stack[i] == 1){
flag = false;
break;
}
if(flag)
cout<<"YES";
else
cout<<"NO";
return 0;
}