problem description
給乙個初始的入棧序列,其次序即為元素的入棧次序,棧頂元素可以隨時出棧,每個元素只能入棧依次。輸入乙個入棧序列,後面依次輸入多個序列,請判斷這些序列是否為所給入棧序列合法的出棧序列。
例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個出棧序列,但4,3,5,1,2就不可能是該序列的出棧序列。假設壓入棧的所有數字均不相等。
input
第一行輸入整數n(1<=n<=10000),表示序列的長度。
第二行輸入n個整數,表示棧的壓入順序。
第三行輸入整數t(1<=t<=10)。
後面依次輸入t行,每行n個整數,表示要判斷的每乙個出棧序列。
output
對應每個測試案例輸出一行,如果由初始入棧序列可以得到該出棧序列,則輸出yes,否則輸出no。
sample input
5
1 2 3 4 5
24 5 3 2 1
4 3 5 1 2
sample output
yes
no
既然要模擬出棧順序,那麼在入棧順序陣列和出棧順序陣列之間肯定有乙個棧來模擬這個過程,但是在壓入棧中的過程中棧頂元素可以在這個時候出棧,這也就意味著不能在全部壓棧之後再判斷出棧,而是一邊壓棧一邊判斷。
怎麼判斷呢?按順序訪問時,當入棧順序序列的某個元素等於出棧順序的某個元素時,這個元素肯定是要出棧的,所以我們直接忽略它不使之入棧,也就達成了讓他出棧的效果。除去這種情況以外,那就肯定要壓棧,因為還沒到這個元素該出棧的時候。而且在這種順序訪問的時候只有乙個元素出棧以後才能訪問下乙個出棧序列的元素,因為這是乙個過程模擬,前乙個元素沒有出棧後乙個元素肯定不能出棧。
當入棧過程結束後,所需的就是把棧中元素按照剩餘的(入棧時未訪問的)出棧順序彈出,看最後棧是否成功清空。
那麼就有如下思路:
輸入入棧序列,出棧序列,構建模擬棧
按照上述,直接對過程進行模擬
入棧結束後對於棧中元素進行按序彈出
判斷:
#include#include #include #include #include #include #include #include #include #include #define determination main
#define lldin(a) scanf_s("%lld", &a)
#define println(a) printf("%lld\n", a)
#define reset(a, b) memset(a, b, sizeof(a))
const int inf = 0x3f3f3f3f;
using namespace std;
const double pi = acos(-1);
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int mod = 1000000007;
const int tool_const = 19991126;
const int tool_const2 = 33;
inline ll lldcin()
while (c >= '0' && c <= '9')
return si * tmp;
}///untersee boot ixd2(1942)
/**although there will be many obstructs ahead,
the desire for victory still fills you with determination..**/
/**last remote**/
ll tmpa[43432], tmpb[43442]//壓入順序與出棧順序
int determination()
else//否則就要把它壓入棧中並訪問下乙個壓入順序陣列中的元素,因為它按照出棧順序來說還沒有出棧
}//壓入過程結束後就可以直接按照其出棧順序陣列模擬即可,也就是說棧頂元素等於出棧元素[pointer2]的時候就使其出棧,否則留在棧中
while (!sta.empty()&&sta.top() == tmpb[pointer2++])
sta.pop();
if (sta.empty())//如果棧裡邊沒有元素,那麼代表這個出棧順序是合法的
cout << "yes" << endl;
else//否則就不合法
cout << "no" << endl;
} return 0;
}
SDUT3334資料結構實驗之棧七 出棧序列判定
time limit 30ms memory limit 1000k 有疑問?點這裡 給乙個初始的入棧序列,其次序即為元素的入棧次序,棧頂元素可以隨時出棧,每個元素只能入棧依次。輸入乙個入棧序列,後面依次輸入多個序列,請判斷這些序列是否為所給入棧序列合法的出棧序列。例如序列1,2,3,4,5是某棧的...
棧 出棧序列判定
給乙個初始的入棧序列,其次序即為元素的入棧次序,棧頂元素可以隨時出棧,每個元素只能入棧依次。輸入乙個入棧序列,後面依次輸入多個序列,請判斷這些序列是否為所給入棧序列合法的出棧序列。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個出棧序列,但4,3,5,1,2就...
SDUT OJ 3334 出棧順序的判定
思路 設立兩個指標i和j,i是出棧的元素的指標,j是入棧順序的指標,建立乙個棧,棧為空,把第j位入棧,再去判斷與第i位是否相同,相同的話,i 棧頂元素出棧,不相同繼續入棧,當j n時就去輸出 no 代表這個出棧的序列不是我入棧的順序,當i n時代表我可以用那種方式出棧 code include in...