有这样的题目:
已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈, 也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法?
类似如下:
已知栈的出栈序列为:3 2 5 4 1,判断该栈的出栈序列是否合法
过程如下:
第一次1-5顺序入栈:1,2,3
第二次 3 出栈:1,2
第三次 2 出栈:2
第四次 4,5 入栈:1,4,5
第五次 5 出栈:1,4
第六次 4 出栈:1
第七次 1 出栈:
最终可以得到合法的出栈序列:3 2 5 4 1
而序列:3 1 2 4 5 则不合法
解决方法主要是使用栈和队列来模拟整个过程,是否满足
具体过程如下:
初始:
queue: 3 2 5 4 1
stack:
第一次:3 2 5 4 1
stack:1
第二次:
queue: 3 2 5 4 1
stack: 1,2
第三次:
queue: 2 5 4 1
stack: 1,2
第四次:
queue 2 5 4 1
stack: 1,2,4
…
最后一次:
queue: 1
stack :1
实现代码如下:
bool judge_formal_seq(queue<int> order){ stack<int> seq;int num = order.size();if (order.empty()) { return false;}for (int i = 1; i <= 5; ++i) { seq.push(i);/*判读队头元素和栈顶元素是否相等,相等则认为该元素可以出栈,两者都pop*/while (!seq.empty() && order.front() == seq.top()) { order.pop();seq.pop();}}if(seq.empty()) { return true;} else { return false;}
}
测试代码如下:
#include
#include
#include
#include using namespace std;bool judge_formal_seq(queue<int> order){ stack<int> seq;int num = order.size();if (order.empty()) { return false;}for (int i = 1; i <= 5; ++i) { seq.push(i);while (!seq.empty() && order.front() == seq.top()) { order.pop();seq.pop();}}if(seq.empty()) { return true;} else { return false;}
}int main() { queue<int> order;int tmp;cout << "construct the exit stack seq :" << endl;for (int i = 0; i < 5; ++i){ cin >> tmp;order.push(tmp);}cout << "judge the stack seq is " << (judge_formal_seq(order)?"true":"false") << endl;return 0;
}
输出如下:
construct the exit stack seq :
3 2 5 4 1
judge the stack seq is trueconstruct the exit stack seq :
3 1 2 5 4
judge the stack seq is false
Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。 我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...
利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...
题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...
题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树: 5 / 2 6 / 1 3示例 1: 输入: [1,6,3,2,5] 输出...