之前同事给我讲的那个逆序输出数组的问题时,我还想过使用栈的先进后出特性来实现,但是稍微再想想还是不要了,根据数组本身就可以实现,使用栈就显得很多余了。栈先进后出的特性,要是稍加利用,也是可以实现先进先出的队列的效果。
Idea
使用两个栈来实现先进先出的存储特性
使用栈暂存再取出的话,就是先进后出,顺序就颠倒过来,那如果再用一个栈来转存一下,不又是把颠倒的顺序载颠倒了一会,最后的结果就是和一开始输入的顺序一致了.以上步骤完成后就实现了先进先出的队列的功能
代码实现
先声明个customizedQueue类,然后使用inQueue()函数来实现将数据输入到inStack的功能 ,outQueue()函数来实现从outStack输出的功能,,chang()就是将数据从inStack转移到outStack中的功能:
主要如下所示
#include <iostream>
#include <stack>
using namespace std;
class customizedQueue {
private:
stack<int> outStack;
stack<int> inStack;
public:
void inQueue(const int& a);
void change();
int outQueue();
};
/*
*使用栈来实现一个队列
* 队列的特点:
* 先进先出
*/
#include "customizedQueue.h"
// 将需要翻转的元素先暂存在输入栈中
void customizedQueue::inQueue(const int& a) {
inStack.push(a);
}
// 将输入存储栈中的元素全部转移到输出栈中
void customizedQueue::change() {
cout << " change " << endl;
int tmp;
if (inStack.empty()) {
exit(1);
}
while (inStack.size() > 0) {
tmp = inStack.top();
inStack.pop();
outStack.push(tmp);
}
}
// 将输出栈中的元素取出
int customizedQueue::outQueue() {
if (outStack.empty()) {
exit(1);
}
// cout << "size=" << outStack.size() << endl;
int get = outStack.top();
outStack.pop();
return get;
}
int main() {
customizedQueue* queue = new customizedQueue();
int arr[] = {10, 7, 82, 9, 13, 5, 2, 34, 54, 3, 26, 6, 37, 6, 48, 11};
int length = sizeof(arr) / sizeof(arr[0]);
cout << " push " << endl;
for (int i = 0; i < length; i++) {
queue->inQueue(arr[i]);
}
queue->change();
int result[length];
for (int i = 0; i < length; i++) {
cout << " pop " << endl;
result[i] = queue->outQueue();
}
for (int i = 0; i < length; i++) {
cout << result[i] << " ";
}
cout << " over" << endl;
delete queue;
return 0;
}