1. 程式人生 > >演算法————入棧出棧合法性檢驗

演算法————入棧出棧合法性檢驗

出棧入棧合法性檢驗

1.首先得講一下對問題的理解,例如這樣一道題問題如下:入棧的序列(1,2,3,4,5),出棧序列為(4,5,3,2,1)是合法序列,入棧的序列(1,2,3,4,5),出棧序列為(1,5,3,2,4)是不合法序列

2.問題就是這樣,也就是說給我們一串這樣的陣列,我們用不同的入棧方式,是否能得到所要驗證的出棧序列,那麼我們可以還原入棧出戰的場景,順著出棧順序的思路入棧出棧,看是否能夠順利出棧入棧(順利出棧入棧即為,判斷棧或者模擬棧最終為空);

3.畫圖理思路

這裡寫圖片描述

程式碼:

#include<iostream>
#include<stack>
using namespace std; bool push_pop_illegal(int* stack_in, int* stack_out, int in_size, int out_size); void test_push_pop_illegal() { int stack_in[5] = { 1, 2, 3, 4, 5 }; int stack_out[5] = { 4, 5, 2, 3, 1 }; int in_size = sizeof(stack_in) / sizeof(stack_in[1]); int out_size = sizeof(stack_out) / sizeof
(stack_out[1]); bool ret = push_pop_illegal(stack_in,stack_out,in_size,out_size); if (ret) cout << "合法" << endl; else cout << "不合法" << endl; } bool push_pop_illegal(int* stack_in, int* stack_out, int in_size, int out_size) { //判斷條件: //1.出棧數目和入棧數目
//2.出入棧順序合法性 if (in_size != out_size) return false; else { stack<int> s; //模擬入棧出棧,如果“模擬棧”最終為空則說明出棧入棧順序合法 int i = 0; int j = 0; for (i; i < in_size; i++) { s.push(stack_in[i]); while (s.size() && s.top() == stack_out[j])//判斷是否可以出棧, //如果可以並按照出棧順序持續出棧,直到序列不匹配時繼續入棧 { s.pop(); j++; } } //如果順利的按照出棧序列出棧入棧,則為合法序列,否則為非法序列 if (s.empty()) return true; else return false; } }