设计一个算法判断通过一个栈能否得到由a0n-1比如为:2134…n指定出栈序列设计一个测试主函数进行测试并给出测试结果。用通俗的语言解释这个问题
题目描述:
给定一个栈,判断是否能通过栈的出栈顺序得到由a[0..n-1](比如为:2,1,3,4,…n)指定的序列。
算法思路:
用一个辅助栈,遍历指定的出栈序列,如果栈顶元素和当前遍历的出栈序列元素相同,则弹出栈顶元素;否则,将a数组中的元素依次入栈,直到栈顶元素和当前遍历的出栈序列元素相同或者a数组中的元素都入栈了为止。
如果最终辅助栈为空,则说明可以通过该栈得到指定的出栈序列,否则不能。
代码实现:
#include <iostream>
#include <stack>
using namespace std;
bool IsPopOrder(int *pPush, int *pPop, int nLength)
{
if (pPush == nullptr || pPop == nullptr || nLength <= 0)
return false;
stack<int> stackData;
int i = 0, j = 0;
while (j < nLength)
{
while (stackData.empty() || stackData.top() != pPop[j])
{
if (i == nLength)
return false;
stackData.push(pPush[i]);
i++;
}
stackData.pop();
j++;
}
return stackData.empty();
}
int main()
{
int pPush[] = {1, 2, 3, 4, 5};
int pPop[] = {4, 5, 3, 2, 1};
int nLength = 5;
if (IsPopOrder(pPush, pPop, nLength))
cout << "可以通过该栈得到指定的出栈序列" << endl;
else
cout << "不能通过该栈得到指定的出栈序列" << endl;
return 0;
}
测试结果:
可通过该栈得到指定的出栈序列。
解释:
对于给定的出栈序列{4, 5, 3, 2, 1},可以通过以下步骤得到:
- 将1入栈,栈顶元素为1;
- 将2入栈,栈顶元素为2;
- 将3入栈,栈顶元素为3;
- 将4入栈,栈顶元素为4;
- 弹出栈顶元素4,当前出栈元素为4;
- 弹出栈顶元素3,当前出栈元素为5;
- 弹出栈顶元素2,当前出栈元素为3;
- 弹出栈顶元素1,当前出栈元素为2;
- 弹出栈顶元素5,当前出栈元素为1。
因此,可以通过该栈得到指定的出栈序列
原文地址: https://www.cveoy.top/t/topic/cjTj 著作权归作者所有。请勿转载和采集!