日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

十三、判断出栈序列

發布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 十三、判断出栈序列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

十三、判斷出棧序列

文章目錄

  • 十三、判斷出棧序列
    • 題目描述
    • 解題思路
    • 上機代碼

題目描述

請判斷:指定的序列能否僅由 入棧出棧 操作得到。

輸入:
有若干組數據輸入
每組數據中,第一行為兩個個整數 n 和 m。n 表示需要依次從 1~n 入棧,m 表示這組數據有 m 個出棧序列需要判斷,當 n=0 且 m=0 時停止。
接下來有 m 行,每行表示一個出棧序列

輸出:
對每一個出棧序列,如果能正常出棧,則輸出 Yes,否則輸出 No

sample:

input:
5 2
1 2 3 4 5
5 4 1 2 3
6 1
6 5 4 3 2 1
0 0

output:
Yes
No

Yes

測試輸入期待的輸出時間限制內存限制額外進程
測試用例 15 2
1 2 3 4 5
5 4 1 2 3
6 2
6 5 4 3 2 1
3 2 5 6 4 1
0 0
Yes
No

Yes
Yes
1秒64M0

解題思路

定義兩個數組 a 和 b,a 數組用來存儲初始序列,即 1—n,b 數組用來存儲待判斷的序列

將 a、b數組從頭進行比較

  • 元素相同則繼續向后比
  • 元素不同且棧空,則將元素 a[i] 壓棧
  • 元素不同棧非空,且棧頂元素和 b[j] 相等,則彈棧

最后判斷棧是否為空,為空則序列符合要求,非空則不符合要求。

上機代碼

#include<cstdio> #include<cstring> #include<stack> #include<cstdlib> using namespace std; int a[1010] = { 0 }, b[1010] = { 0 }; int main() {int n = 0, m = 0;int flag = 0; //flag用來控制格式while (~scanf("%d%d", &n, &m) && n+m){if (flag)printf("\n");for (int i = 1; i <= n; i++){a[i] = i;}while (m--){for (int j = 1; j <= n; j++){scanf("%d", &b[j]);}stack<int>s;int x = 1, y = 1;while (y <= n){if (a[x] == b[y]) //相同則繼續向后判斷{x++;y++;}else if (!s.empty() && s.top() == b[y]) //棧頂元素與輸入元素相同則彈棧{y++;s.pop();}else if (x <= n) //初始數據壓棧{s.push(a[x]);x++;}elsebreak;}if (s.empty())printf("Yes\n");elseprintf("No\n");}flag = 1;}//system("pause")return 0; }

總結

以上是生活随笔為你收集整理的十三、判断出栈序列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。