题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appenTail和deleteHead,分别完成在队列尾部插入结点和队列头部删除结点的功能。
解法:因为栈是后入先出,而队列是先入先出。即出栈的顺序是和入栈的顺序颠倒的,由负负得正很容易想到两个栈可以实现按原先的顺序输出。
算法设计:(1)入队的时候总是插入stack1的尾部;
(2)出队的时候,如果stack2不为空,直接出栈,因为stack2中若有元素,它的栈顶元素是最先进入队列的元素,直接弹出;如果stack2为空,stack1的所有元素出栈,插入stack2,直到stack1为空。先进入的元素压在stack1的底端,从stack1出栈就出现在stack2的顶端了。
#include <iostream>
#include <stack>
using namespace std;
template <typename T> class CQueue
{
public:
// CQueue(void);
// ~CQueue(void);
void appendTail(const T& node);
T deleteHead();
void printQueue();
int size();
private:
stack<T> stack1;
stack<T> stack2;
int len;
};
template<typename T> void CQueue<T>::appendTail(const T& element)
{
stack1.push(element);
len++;
}
template<typename T> T CQueue<T>::deleteHead()
{
if(stack2.size() <= 0)
{
while(stack1.size() > 0)
{
T& data = stack1.top();
stack1.pop();
stack2.push(data);
}
}
if(stack2.size() == 0)
cout << "queue is empty" << endl;
T head = stack2.top();
stack2.pop();
return head;
}
template<typename T> int CQueue<T>::size()
{
return len;
}
template<typename T> void CQueue<T>::printQueue()
{
for(int i = 0; i < size(); ++i)
cout << deleteHead() << " ";
cout << endl;
}
int main() {
// your code goes here
CQueue<int> Q;
for(int i=1; i<10; ++i)
Q.appendTail(i);
Q.printQueue();
return 0;
}引申:用两个队列实现一个栈
解法:如果输入a,b,c,d,e,出栈的时候先输出a,那么可以将b,c,d,e已到queue2中,这时候queue1中只剩下a,直接出队。再出栈的时候只要把c,d,e再移到queue1中就可以了,这时候queue2只剩下b,依次类推。保证两个队列总有一个为空,插入的时候选择非空的队列插入。
#include <iostream>
#include <queue>
#include <exception>
using namespace std;
template <typename T> class MyStack
{
public:
T pop();
void push(const T& node);
MyStack();
bool empty();
private:
queue<T> queue1;
queue<T> queue2;
};
template <typename T> MyStack<T>::MyStack()
{
while(!queue1.empty())
queue1.pop();
while(!queue2.empty())
queue2.pop();
}
template <typename T> void MyStack<T>::push(const T& node)
{
if(queue1.empty() && !queue2.empty())
queue2.push(node);
else
queue1.push(node);
}
template <typename T> T MyStack<T>::pop()
{
if (queue1.empty() && queue2.empty())
{
logic_error ex("Stack is empty");
throw std::exception(ex);
}
T tmp;
queue<T>& srcQ = queue1.empty() ? queue2 : queue1;
queue<T>& dstQ = queue1.empty() ? queue1 : queue2;
while (srcQ.size() > 1)
{
dstQ.push(srcQ.front());
srcQ.pop();
}
tmp = srcQ.front();
srcQ.pop();
return tmp;
}
template <typename T> bool MyStack<T>::empty()
{
return queue1.empty() && queue2.empty();
}
int main() {
// your code goes here
MyStack<int> s;
for(int i = 1; i < 10; ++i)
s.push(i);
while(!s.empty())
cout << s.pop() << " ";
cout << endl;
getchar();
return 0;
}
本文介绍了一种使用两个栈实现队列的方法,通过特定的操作流程确保能够按照队列的先进先出原则处理数据。同时,还探讨了如何利用两个队列来模拟栈的行为。
1887

被折叠的 条评论
为什么被折叠?



