7-31 堆疊操作合法性 (20 分)
 

假設以SX分別表示入棧和出棧操作。如果根據一個僅由SX構成的序列,對一個空堆疊進行操作,相應操作均可行(如沒有出現刪除時棧空)且最後狀態也是棧空,則稱該序列是合法的堆疊操作序列。請編寫程式,輸入SX序列,判斷該序列是否合法。

輸入格式:

輸入第一行給出兩個正整數N和M,其中N是待測序列的個數,M(≤50)是堆疊的最大容量。隨後N行,每行中給出一個僅由SX構成的序列。序列保證不為空,且長度不超過100。

輸出格式:

對每個序列,在一行中輸出YES如果該序列是合法的堆疊操作序列,或NO如果不是。

輸入樣例:

4 10
SSSXXSXXSX
SSSXXSXXS
SSSSSSSSSSXSSXXXXXXXXXXX
SSSXXSXXX
 
結尾無空行

輸出樣例:

YES
NO
NO
NO
 
#include <iostream>
using namespace std; int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
string s;
cin>>s;
int sum=0;
int flag = 0;
for(int j=0;s[j]!='\0';j++){
if(s[j]=='S'){
sum++;
if(sum>m){
cout<<"NO"<<endl;
flag = 1;
break;
}
} else{
sum--;
if(sum<0){
cout<<"NO"<<endl;
flag = 1;
break;
}
}
}
if(!flag){
if(sum==0)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}

演算法思想:入棧表示+1,出棧表示-1,用sum來記錄最終的數值。若中途出現sum<0 表示棧空,出棧失敗,此時輸出 NO。若中途sum值大於m,表示棧滿,此時也輸出 NO 。

若最終sum==0,且都不滿足以上兩個問題,此時輸出YES。