洛谷 P1739 表達式括號匹配 棧

題目鏈接: 點我跳轉
題目大意: 給定一個字符串,判斷其中的左右括號是否配對
題目分析: 洛谷歸類在線性結構裏面,應該是用棧,那麼我們遇到左括號,就在棧裏面放一個1,遇到右括號就取出一個1來,如果結束的時候還有1在裏面,就是配對成功,沒空就是失敗。如果在讀取的過程中棧空了又遇到了右括號,那也說明配對失敗。但是我們好像只用到了棧的大小,所以用一個數字來表示棧的大小就OK了。

用棧寫的代碼

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>

using namespace std;

int main(){
    char x;
    int t;
    stack<int> stk;
    while(1){
        cin>>x;
        if(x == '@'){
            if(stk.empty())printf("YES");
            else printf("NO");
            break;
        }
        t = (x == '(')-(x == ')');//左括號爲1,右括號爲-1,其他字符爲0
        if(t == 1)stk.push(1);//隨便放進去一個數字好了反正不重要
        else if(t == -1){
            if(stk.empty()){
                printf("NO");
                break;
            }
            stk.pop();
        }
    }
    
    return 0;
}

這是不用棧的版本

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>

using namespace std;

int main(){
	char x;
	int t,stk(0);
	while(1){
		cin>>x;
		if(x == '@'){
			if(!stk)printf("YES");
			else printf("NO");
			break;
		}
		t = (x == '(')-(x == ')');
		if(t == 1)stk++;
		else if(t == -1){
			if(!stk){
				printf("NO");
				break;
			}
			stk--;
		}
	}
	
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章