双栈排序
偶然发现的一个题目,应该是面试手撕的算法题,看到了撸它呗!
题目
给定一个乱序的栈,设计算法将其升序排列。
ps: 允许额外使用一个栈来辅助操作
输入 [4, 2, 1, 3]
输出 [1, 2, 3, 4]
分析
| | | |
|1| | |
|2| | |
|4| |3|
stk tmp
(1)
此时遇到的问题就是要将 stk
栈顶的元素与 tmp
栈顶的元素进行交换位置;
| | | |
|3| | |
|2| | |
|4| |1|
stk tmp
(2)
继续
| | | |
| | | |
|2| |3|
|4| |1|
stk tmp
(3)
重复步骤(2)进行交换
| | | |
| | | |
|3| |2|
|4| |1|
stk tmp
(4)
继续
| | |4|
| | |3|
| | |2|
| | |1|
stk tmp
(3)
stk
为空结束
代码实现
输入输出得补补,要不然现场撸代码就完犊子了!!!!!!
#include<iostream>
#include<stack>
using namespace std;
stack<int> stackSort(stack<int>& stk) {
stack<int> tmp;
while(!stk.empty()) {
int stkNum = stk.top();
stk.pop();
while(!tmp.empty() && tmp.top() > stkNum) { // 需要进行交换
int tmpNum = tmp.top();
tmp.pop();
stk.push(tmpNum);
}
tmp.push(stkNum);
}
return tmp;
}
int main() {
stack<int> stk;
stk.push(4);
stk.push(2);
stk.push(1);
stk.push(3);
int s = stk.size();
/*
for(int i = 0; i < s; ++i) {
cout << "第" << 4-i << ": "<< stk.top() << endl;
stk.pop();
}*/
stack<int> result = stackSort(stk);
int res = result.size();
for(int i = 0; i < res; ++i) {
cout << result.top() << endl;
result.pop();
}
return 0;
}