用俩个栈实现队列

栈、队列

一、题目:(感谢 http://blog.csdn.net/v_JULY_v 提供的题目)

用俩个栈实现队列。

某队列的声明如下:
template<typename T>
class CQueue
{
public:
    CQueue() {}
    ~CQueue() {}
    void appendTail(const T& node); // append a element to tail
    void deleteHead(); // remove a element from head

private:
    Stack<T> m_stack_in;
    Stack<T> m_stack_out;
};
分析:从上面的类的声明中,我们发现在队列中有两个栈。
因此这道题实质上是要求我们用两个栈来实现一个队列。

栈是一种后入先出的数据容器,对队列进行的插入和删除操作都是在栈顶上进行;
队列是一种先入先出的数据容器,我们总是把新元素插入到队列的尾部,而从队列的头部删除元素。

二、分析:
1.设定A栈用于保存队列信息,B栈为辅助栈
2.入列,如同入栈(A)操作
3.出列,把出栈(A)的元素入栈(B),至A栈中的最后一位舍去,把出栈(B)的元素入栈(A),完成出列的过程



三、代码:
#include<iostream>
using namespace std;

const int stackSize = 10;

template<typename T> 
class Stack
{
public:
	Stack() {size = -1;}
	~Stack(){}
	void push(const T& node);//入栈  
	T pop();//出栈  
	void printStack();//输出栈中所有元素 
	int size;//栈大小  
private:
	int stackArray[stackSize];//保存栈元素
};

template<typename T> 
void Stack<T>::push(const T& node)
{
	if(size == stackSize-1) throw "上溢出";
	else stackArray[++size] = node;
}

template<typename T>
T Stack<T>::pop()
{
	if(size == -1) throw "下溢出";  
	else return stackArray[size--];
}

template<typename T>
void Stack<T>::printStack()
{
	for(int i=0;i<=size;i++) cout<<stackArray[i]<<"  ";
	cout<<endl;
}

template<typename T> 
class CQueue
{
public:
	CQueue() {}
	~CQueue() {}
	void appendTail(const T& node); // append a element to tail
	void deleteHead(); // remove a element from head

private:
	Stack<T> m_stack_in;
	Stack<T> m_stack_out;
};

template<typename T> 
void CQueue<T>::appendTail(const T& node)
{
	m_stack_in.push(node);
	m_stack_in.printStack();
}

template<typename T> 
void CQueue<T>::deleteHead()
{
	int size = m_stack_in.size;
	for(int i=0;i<size;i++) m_stack_out.push(m_stack_in.pop());
	m_stack_in.size = -1;
	size = m_stack_out.size;
	for(int i=0;i<=size;i++) m_stack_in.push(m_stack_out.pop());
	m_stack_out.size = -1;
	m_stack_in.printStack();
}

void main()
{
	CQueue<int> cq;
	cout<<"入列  ";
	cq.appendTail(1);
	cout<<"入列  ";
	cq.appendTail(2);
	cout<<"入列  ";
	cq.appendTail(3);
	cout<<"出列  ";
	cq.deleteHead();
	cout<<"出列  ";
	cq.deleteHead();
	cout<<"入列  ";
	cq.appendTail(4);
	cout<<"出列  ";
	cq.deleteHead();
	cout<<"出列  ";
	cq.deleteHead();
	cout<<"入列  ";
	cq.appendTail(5);
}

四、进阶:
两个队列实现栈。
分析:栈使用数组实现比较方便;而队列使用链表实现比较方便。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值