C語(yǔ)言實(shí)現(xiàn)出棧序列合法性判定
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)出棧序列合法性判定的具體代碼,供大家參考,具體內(nèi)容如下
輸入兩個(gè)整數(shù)序列,第一個(gè)序列表示棧的壓入順序,請(qǐng)判斷第二個(gè)序列是否可能為該棧的彈出順序。
假設(shè)壓入棧的所有數(shù)字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對(duì)應(yīng)的一個(gè)彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個(gè)序列的長(zhǎng)度是相等的)
輸入格式
第一行一個(gè)整數(shù)n,表示輸入序列的長(zhǎng)度。(1<=n<=10000)
第二行n個(gè)整數(shù),表示棧的壓入順序。
第三行n個(gè)整數(shù),表示棧的出棧順序。
輸出格式
如果是彈出序列,輸出yes,否則輸出no。
輸入樣例
5
1 2 3 8 6
8 6 3 2 1
輸出樣例
yes
準(zhǔn)備工作:
①定義一個(gè)棧,并且實(shí)現(xiàn)它的基本操作(出棧popStack()/壓棧pushStack()/訪問(wèn)棧頂元素getTop()/判斷棧是否為空isEmpty()等)
②定義兩個(gè)長(zhǎng)度為10000的整形數(shù)組的,分別表示要壓入順序的數(shù)字msg以及出棧順序的數(shù)字target.。為了避免要書(shū)寫(xiě)兩個(gè)for循環(huán)來(lái)輸入,這里可以通過(guò)調(diào)用方法input(int *arr,int len),每次輸入msg/target的時(shí)候,只要調(diào)用這個(gè)方法即可,從而減少代碼量。
解題思路:(主要是通過(guò)循環(huán)嵌套)
1、通過(guò)遍歷msg,將遍歷得到的數(shù)字壓入到棧中。
2、每次壓入數(shù)字之后,要獲取棧頂元素ch,然后判斷ch是否和當(dāng)前target下標(biāo)對(duì)應(yīng)的數(shù)字相同,如果相同,那么就從棧中跳出一個(gè)元素,同時(shí)target的下標(biāo)后移。這時(shí)候,我們依舊需要從棧中獲取棧頂元素,那這個(gè)棧頂元素和當(dāng)前target下標(biāo)的數(shù)字進(jìn)行比較,如果相等,那么繼續(xù)重復(fù)上述的操作。
這里之所以需要這么做,是因?yàn)?span style="color: #800000">考慮到類(lèi)似于壓入一個(gè)元素之后,就跳出一個(gè)元素的可能,所以我們需要在target中找到相同的數(shù)字之后,不僅需要將target后移,同時(shí)需要將從棧中跳出原來(lái)的棧頂元素,然后拿新的棧頂元素和target當(dāng)前下標(biāo)的值進(jìn)行比較,直到新的棧頂元素和target當(dāng)前下標(biāo)的值不相等。
3、如果不相等,那么這時(shí)候就將msg后移。重復(fù)1、2步驟。直到msg已經(jīng)遍歷完了。
4、這時(shí)候如果target已經(jīng)遍歷完了,那么就說(shuō)明了target就是msg的一種出??赡埽駝t,如果target沒(méi)有遍歷完,說(shuō)明target不是msg的一種出??赡?。
圖解:
完整代碼(C語(yǔ)言):
#include<stdio.h> #define ERROR 0 #define OK 1 #define MAX_SIZE 10000 typedef struct NODE{ int arr[MAX_SIZE]; int top; }Node; void init(Node &s){ s.top = 0; } int pushElem(Node &s,int c){ if(s.top == MAX_SIZE) return ERROR; s.arr[s.top++] = c; return OK; } int popElem(Node &s,int &e){ if(s.top == 0) return ERROR; e = s.arr[--s.top]; return OK; } int getTop(Node &s,int &e){ if(s.top == 0) return ERROR; e = s.arr[s.top - 1]; return OK; } int isEmpty(Node &s){ return s.top == 0; } int testIsTrue(int *msg,int *target){ Node s; int ch; init(s); while(*msg != '\0'){ pushElem(s,*msg);//將壓棧字符串中的字符壓入棧中 //獲取棧頂元素 getTop(s,ch); while(ch == *target){ //如果當(dāng)前棧頂?shù)淖址蛷棗W址嗤?,那么就從棧中跳? popElem(s,ch); target++;//彈棧字符串后移 /* //獲取棧頂元素,這里之所以不用判斷棧是否為空,是因?yàn)橹饕紤]ch是否等于target 而此時(shí)target已經(jīng)后移了,所以并不會(huì)造成死循環(huán) */ getTop(s,ch); } msg++;//當(dāng)ch不等于彈棧字符串的字符的時(shí)候,那么就將后移 } if(*target != '\0') return 0; return 1; } void input(int *arr,int n){ int i; for(i = 0; i < n; i++) scanf("%d",&arr[i]); } int main(){ int msg[10000],target[10000]; int n,flag; printf("請(qǐng)輸入棧的元素個(gè)數(shù):"); scanf("%d",&n); input(msg,n);//調(diào)用input方法,從而輸入n個(gè)數(shù)字 input(target,n); flag = testIsTrue(msg,target);//判斷出棧順序是否為壓棧順序的一種出棧可能 if(flag) printf("yes"); else printf("no"); return 0; }
運(yùn)行結(jié)果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談C++中對(duì)象的復(fù)制與對(duì)象之間的相互賦值
這篇文章主要介紹了淺談C++中對(duì)象的復(fù)制與對(duì)象之間的相互賦值,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09Objective-C中常用的結(jié)構(gòu)體NSRange,NSPoint,NSSize(CGSize),NSRect實(shí)例分析
這篇文章主要介紹了Objective-C中常用的結(jié)構(gòu)體NSRange,NSPoint,NSSize(CGSize),NSRect實(shí)例分析,有助于更加直觀的理解Object-C常用的結(jié)構(gòu)體,需要的朋友可以參考下2014-07-07C語(yǔ)言實(shí)現(xiàn)Linux下的socket文件傳輸實(shí)例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)Linux下的socket文件傳輸?shù)姆椒?較為詳細(xì)的分析了C語(yǔ)言文件Socket文件傳輸客戶(hù)端與服務(wù)器端相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-06-06C語(yǔ)言實(shí)現(xiàn)掃雷小游戲(適合初學(xué)者)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷小游戲,適合初學(xué)者練習(xí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03C++自帶的sort函數(shù)如何對(duì)vector容器元素進(jìn)行排序
這篇文章主要介紹了C++自帶的sort函數(shù)如何對(duì)vector容器元素進(jìn)行排序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10C語(yǔ)言庫(kù)函數(shù)strcpy的使用及模擬實(shí)現(xiàn)
本文主要介紹了C語(yǔ)言庫(kù)函數(shù)strcpy的使用及模擬實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04C++ 中靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的區(qū)別
這篇文章主要介紹了C++ 中靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-05-05C++實(shí)現(xiàn)LeetCode(10.正則表達(dá)式匹配)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(10.正則表達(dá)式匹配),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07