演算法————入棧出棧合法性檢驗
阿新 • • 發佈:2019-01-30
出棧入棧合法性檢驗
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;
}
}