队列的特点是先进先出,而堆栈则是后进先出。
采用两个队列来模拟堆栈的特性,关键是保证每次弹出的数据为最后添加进队列的。
核心: queue1始终保持后入的元素,queu2始终保存排在queue1之前的元素。
模拟堆栈push, 比较简单,只需要向queue1中压人数据即可,queue1若有元素,则一定是后入的元素。
模拟堆栈的pop:
1、若queue1有元素,则一直弹出,保存到queue2,直到queue1只剩一个元素时候,弹出queue1的最后一个元素;
2、queue1中没有元素,则考虑queue2,将queue2中的元素弹出至queue1,直到queue2中只剩最后一个元素,然后弹出;
模拟堆栈的top:
1、若queue1有元素,则一直弹出,保存到queue2,直到queue1只剩一个元素时候,输出queue1的最后一个元素;
2、queue1中没有元素,则考虑queue2,将queue2中的元素弹出至queue1,直到queue2中只剩最后一个元素,输出queue2的最后一个元素;这里切记需要将 queue2的最后一个元素弹出至queue1.
// ConsoleApplication3.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include <queue>
using namespace std;
class myqueue{
public:
int pop_value();
void push_value(int);
int top_value();
int get_size();
private :
queue<int> que1;
queue<int> que2;
};
int myqueue::get_size()
{
return this->que1.size() + this->que2.size();
}
int myqueue::pop_value()
{
int que1size= this->que1.size();
int que2size = this->que2.size();
int retValue;
if (que1size > 0)
{
while (que1size > 1)
{
int value = this->que1.front();
this->que2.push(value);
this->que1.pop();
que1size--;
}
retValue = this->que1.front();
this->que1.pop();
}
else
{
if (que2size == 0)
{
return -1;//error
}
while (que2size>1)
{
int value = this->que2.front();
this->que1.push(value);
this->que2.pop();
que2size--;
}
retValue = this->que2.front();
this->que2.pop();
}
return 0;
}
void myqueue::push_value(int num)
{
this->que1.push(num);
}
int myqueue::top_value()
{
int que1size = this->que1.size();
int que2size = this->que2.size();
int retValue=0;
if (que1size > 0)
{
while (que1size > 1)
{
int value = this->que1.front();
this->que2.push(value);
this->que1.pop();
que1size--;
}
retValue = this->que1.front();
}
else
{
if (que2size == 0)
{
return 0;//error
}
while (que2size>1)
{
int value = this->que2.front();
this->que1.push(value);
this->que2.pop();
que2size--;
}
retValue = this->que2.front();
this->que1.push(retValue); //keep the order of the item
this->que2.pop();
}
return retValue;
}
int _tmain(int argc, _TCHAR* argv[])
{
myqueue test;
test.push_value(1);
test.push_value(3);
test.push_value(5);
test.push_value(11);
test.push_value(21);
test.push_value(31);
test.push_value(41);
test.push_value(53);
test.push_value(65);
test.push_value(71);
test.push_value(83);
test.push_value(91);
test.push_value(103);
test.push_value(205);
test.push_value(305);
int ret;
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
test.push_value(111);
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
ret = test.top_value();
printf("ret = %d \n", ret);
test.pop_value();
getchar();
return 0;
}