栈的经典例题
1.栈排序
题目背景:
给出定一个已经装有数的栈,要求使用一个辅助栈,完成原始栈的排序,且除必要单变量外,不用其它任何数据结构(包括数组),即你可以使用的数据结构只有一种、两个:原始栈和辅助栈。
输入格式:
第一行一个数n,表示原栈里面数的个数
第二行n个整数,按照原始栈从栈底到栈顶的顺序给出。
输出格式:
一行n个整数,按照从大到小的顺序输出,每两个数字之间两个空格
解题思路:
(1)由于只有两个栈,那么原始栈就用来储存数据,而辅助栈就用来做排序工作
(2)当辅助栈没有元素的时候就把原始栈的栈顶移动到辅助栈里面去
(3)由于要从大到小输出,而栈的结构是后进先出,所以从栈底到栈顶应该是有小到大
(4)现在从原始栈中取数据,如果原始栈的栈顶元素大于或者等于辅助栈的栈顶元素,那么直接将数据移入即可;但是当原始栈的栈顶元素小于辅助栈的栈顶元素时,应该将该数据保存到一个单变量中,然后从辅助栈的栈顶开始想原始栈中塞入数据,直到栈顶元素小于或等于该元素时,将该元素压入栈中。
(5)要考虑到栈是否为空的情况哟
至此思路结束,下面是代码实现:
#include<iostream>
#include<stack>
using namespace std;
int main() {
stack<int>Num_data;
stack<int>Num_sort;
int n, temp; cin >> n;
for (int i = 0; i < n; i++) {
cin >> temp;
Num_data.push(temp);
}
Num_sort.push(Num_data.top());
Num_data.pop();
while (!Num_data.empty()){
if (Num_data.top() >= Num_sort.top()) {
Num_sort.push(Num_data.top());
Num_data.pop();
}
else {
temp = Num_data.top();
Num_data.pop();
while (!Num_sort.empty() && temp < Num_sort.top()) {
Num_data.push(Num_sort.top());
Num_sort.pop();
}
Num_sort.push(temp);
}
}
while (!Num_sort.empty()) {
cout << Num_sort.top() << " ";
Num_sort.pop();
}
}
2.验证出栈顺序
题目背景:
给定一个入栈顺序和一个出栈结果,你需要判断基于给定的入栈顺序,能不能实现给出的出栈结果?
如:给出入栈顺序1,2,3,4,5和出栈结果3,4,2,5,1。
1. 1入栈
2. 2入栈
3. 3入栈
4. 3出栈
5. 4入栈
6. 4出栈
7. 2出栈
8. 5入栈
9. 5出栈
10 1出栈
至此便可得到3,4,2,5,1的出栈结果。
但是我要是给出1,2,3,4,5作为入栈顺序和5,3,4,2,1作为出栈结果,那么此时便是无解的。因为1,2,3,4,5作为入栈顺序是无论如何也无法得到5,3,4,2,1作为出栈结果的。
题目描述:
给定若干组入栈顺序和出栈结果,要求判断它们分别有没有解。
输入格式:
第一行一个整数T,表示你需要验证的组数
接下来3×T行,每三行中:
第一行一个正整数n,表示需要验证的栈的规模
接下来两行,分别对应给出的入栈顺序和出栈结果
(给出的入栈顺序和出栈结果均为1->n的自然数)
输出格式:
输出T行,Yes和No分别代表每组数据所给出的出栈结果时候能够基于给出的入栈顺序达到。
实现代码:
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
namespace fast_IO {
inline int read() {
int x = 0, f = 1; char ch = getchar();
while (!isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); }
while (isdigit(ch)) x = x * 10 + (ch ^ 48), ch = getchar();
return x * f;
}
inline void write(int x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
};
using namespace fast_IO;
int main() {
int n; n = read();
for (int i = 0; i < n; i++) {
int num, temp;//num表示规模,temp用来作为中介
num = read();
int* Stack_in = new int[num];//记录入栈顺序的一个数组
stack<int>s;//一个栈
for (int j = 0; j < num; j++) {
Stack_in[j] = read();
}//输出入栈顺序
queue<int>Stack_out;//一个队列,用来记录出栈顺序
for (int j = 0; j < num; j++) {
temp = read();
Stack_out.push(temp);
}
//初始化已经完成
for (int k = 0; k < num; k++) {
s.push(Stack_in[k]);//将数组中的数字压入到栈中
while (!s.empty() && s.top() == Stack_out.front()) {
s.pop();
Stack_out.pop();
}
}
if (Stack_out.size() == 0)cout << "Yes" << endl;//队列规模为0表示成功
else cout << "No" << endl;
}
}