1. 程式人生 > 其它 >PTA 浙大《資料結構(第二版)》習題3.9 堆疊操作合法性 (20分)

PTA 浙大《資料結構(第二版)》習題3.9 堆疊操作合法性 (20分)

技術標籤:資料結構資料結構堆疊演算法c語言

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

輸入格式:

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

輸出格式:

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

輸入樣例:

4 10
SSSXXSXXSX
SSSXXSXXS
SSSSSSSSSSXSSXXXXXXXXXXX
SSSXXSXXX

輸出樣例:

YES
NO
NO
NO

主要思路

此題較容易,主要考察堆疊。
注意點:在棧操作過程中,棧指標小於-1或大於N-1均是非法的,同時操作結束後棧指標不為-1也是非法的。

編譯器C(gcc)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
    int N,M,len,flag,top;
    char stack[100];
    scanf("%d",&N); //讀取序列個數
    scanf("%d"
,&M); //讀取最大容量 for(int i=0;i<N;i++){ //對N個序列操作 flag=0;//初始化非法標誌 top=-1;//初始化棧指標 scanf("%s",stack); //獲取該序列 len=strlen(stack); //獲取該序列的長度 for(int j=0;j<len;j++){ if(stack[j]==83)top++;//入棧 if(stack[j]==88
)top--;//出棧 //判斷該步驟是否非法 if(top<-1||top>M-1){ flag=1; //非法標誌 break; } } //針對最後一次輸出處理,不換行 if(i==N-1){ if(top==-1&&flag!=1){ printf("YES"); } else{ printf("NO"); } } else{ if(top==-1&&flag!=1){ printf("YES\n"); } else{ printf("NO\n"); } } } system("pause"); return 0; }