數據結構----棧的練習(打基礎的好題目)

題目如下

題目描述

給出兩個序列 pushed 和 poped 兩個序列,其取值從 1 到 n(n≤100000)。已知入棧序列是 pushed,如果出棧序列有可能是 poped,則輸出 Yes,否則輸出 No。爲了防止騙分,每個測試點有多組數據。

輸入格式

第一行一個整數 qq,詢問次數。

接下來 qq 個詢問,對於每個詢問:

第一行一個整數 nn 表示序列長度;

第二行 nn 個整數表示入棧序列;

第二行 nn 個整數表示出棧序列;

輸出格式

對於每個詢問輸出答案。

輸入輸出樣例

輸入 #1複製

2
5
1 2 3 4 5
5 4 3 2 1
4
1 2 3 4
2 4 1 3

輸出 #1複製

Yes
No

解題思路方法:

沒啥好說的,直接上代碼

#include <bits/stdc++.h>

using namespace std;

const int MAX = 100005;
const int INF = 0x7fffffff;
int N,Q;
int pushEd[MAX];
int popEd[MAX];

void solution() {
    stack<int> si;
    int index = 0;
    for (int i = 0; i < N; ++i) {
        si.push(pushEd[i]);
        while(!si.empty()&&si.top()==popEd[index]) {
            si.pop();
            index++;
        }
    }
    while (index<N){
        if(si.top()==popEd[index]) si.pop();
        else si.push(popEd[index]);
        index++;
    }
    if(si.empty()) printf("Yes\n");
    else printf("No\n");
}

int main() {
    freopen("../data","r",stdin);
    scanf("%d",&Q);
    while (Q--) {
        scanf("%d",&N);
        for (int i = 0; i < N; ++i) {
            scanf("%d",&pushEd[i]);
        }
        for (int i = 0; i < N; ++i) {
            scanf("%d",&popEd[i]);
        }
        solution();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章