为说明思想,假设队列、栈都很大,不会出现满的情况。
1. 两个栈实现队列
//前提已知: struct Stack { int top; //栈顶指针 int stacksize;//栈的大小 int *s; //栈底指针 }; void InitStack(Stack *s); void Push(Stack *s, int k); int Pop(*s); int IsStackEmpty(*s); int IsStackFull(*s);
实现一
思路
s1是入栈的,s2是出栈的。
- 入队列,直接压到s1是就行了
- 出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素;再把s2的所有元素全部压回s1中
实现二
思路
s1是入栈的,s2是出栈的。保证所有元素都在一个栈里面
- 入队列时:如果s1为空,把s2中所有的元素倒出压到s1中;否则直接压入s1
- 出队列时:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素
比较:与实现一相比较,出队列时不必每次都捣鼓了。
实现三
思路
s1是入栈的,s2是出栈的。
- 入队列:直接压入s1即可
- 出队列:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素
比较
与实现二相比较,入队直接入即可,感觉此时已是最优。
参考代码
#include<iostream>
#include<stdlib.h>
#include<stack>
using namespace std;
#include<stdlib.h>
#include<stack>
using namespace std;
template <typename T>
class CQueue
{
public:
CQueue(void);
~CQueue(void);
void Push(const T& node);
T Pop();
private:
stack<T> stack1;
stack<T> stack2;
};
class CQueue
{
public:
CQueue(void);
~CQueue(void);
void Push(const T& node);
T Pop();
private:
stack<T> stack1;
stack<T> stack2;
};
//构造函数
template <typename T> CQueue<T>::CQueue(void)
{
}
template <typename T> CQueue<T>::CQueue(void)
{
}
//析构函数
template <typename T> CQueue<T>::~CQueue(void)
{
}
template <typename T> CQueue<T>::~CQueue(void)
{
}
//插入元素
template <typename T> void CQueue<T>::Push(const T& node)
{
stack1.push(node);
}
template <typename T> void CQueue<T>::Push(const T& node)
{
stack1.push(node);
}
//删除元素并返回
template <typename T> T CQueue<T>::Pop()
{
if(stack2.size()<=0)
{
while(stack1.size()>0)
{
stack2.push(stack1.top());
stack1.pop();
}
}
if(stack2.size()==0)
template <typename T> T CQueue<T>::Pop()
{
if(stack2.size()<=0)
{
while(stack1.size()>0)
{
stack2.push(stack1.top());
stack1.pop();
}
}
if(stack2.size()==0)
cout<<"队列为空"<<endl;
T head=stack2.top();
stack2.pop();
return head;
}
T head=stack2.top();
stack2.pop();
return head;
}
void main()
{
CQueue<int> queue;
queue.Push(1);
queue.Push(2);
queue.Push(3);
queue.Push(4);
int len=4;
while(len>0)
{
cout<<queue.Pop()<<endl;
--len;
}
{
CQueue<int> queue;
queue.Push(1);
queue.Push(2);
queue.Push(3);
queue.Push(4);
int len=4;
while(len>0)
{
cout<<queue.Pop()<<endl;
--len;
}
system("pause");
}
}