oj 1028

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;
}

扫描二维码关注公众号,回复: 5769273 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_40128883/article/details/88243757