两个队实现栈

我们知道队的特点是先进先出,元素只能从队的尾部进入,只能从队的尾部出来;栈的特点是先进先出,先进栈的元素被压入栈底,后进入的元素覆在栈顶,出栈时也只能从栈的顶部出来。所以我们要借用两个队来实现栈的功能,先不用栈自身的属性却可以实现栈的属性。(队用链表来实现)

现有两个队,我们将他们分别记为Qin,Qout,开始是将元素插入到Qin中,然后将将除了队尾的元素全部保存到Qout中,保存的过程中依次将这些元素Pop掉,最后Qin中就只剩下开始时队尾的那个元素,现在又将Qout中的元素取出来存到Qin中,这是Qin中的元素顺序就改变了,开始的队尾元素变成了队头元素其它的顺序暂时不变,将Qin队头元素再将其Pop掉就可以了,一次类推就可以实现了栈的后进先出的功能。

(Queue.h)

class Node

{

public:

Node(const T& data) :_next(NULL), _data(data)

{}

Node<T>* _next;

T _data;

};

template <typename T>

class Queue

{

public:

Queue(Node<T>* head=NULL) :_head(head), _tail(NULL)

{

}

~Queue()

{

if (Empty())

{

Node<T>* cur = _head;

while (cur)

{

Node<T>* del;

del = cur;

cur = cur->_next;

delete del;

del = NULL;

}

_head = NULL;

_tail = NULL;

}

}

Queue(const Queue<T>& q)

{

Node<T>* cur = q._head;

while (cur)

{

Push(cur->_data);

cur = cur->_next;

}

}

Queue<T>& operator=(const Queue<T>& q)

{

if (this != &q)

{

delete _head;

_head = NULL;

Node<T>* cur = q._head;

while (cur)

{

Push(cur->_data);

cur = cur->_next;

}

}

return *this;

}

void Push(const T& d)

{

Node<T>* newNode = new Node<T> (d);

if (_head == NULL)

{

_head = newNode;

_tail = newNode;

}

else//实际是尾插

{

_tail->_next=newNode;

_tail = newNode;

}

}

void Pop()//头部删除

{

if (Empty())

{

if (_head == _tail)//一个节点

{

delete _head;

_head = NULL;

_tail = NULL;

}

else//多个节点

{

Node<T>* del = _head;

_head = _head->_next;

delete del;

del = NULL;

}

}

}

T& Back()

{

if (Empty())

{

return _tail->_data;

}

}

T& Front()

{

if (Empty())

{

return _head->_data;

}

}

bool Empty()

{

return _head != NULL;

}

size_t Size()

{

Node<T>* cur = _head;

size_t count = 0;

while (cur)

{

cur = cur->_next;

count++;

}

return count;

}

private:

Node<T>* _head;

Node<T>* _tail;

};

/*******************************************/

(Stack.h)

class Stack

{

public:

Stack()

{

}

~Stack()

{

}

Stack(const Stack<T>& s)

{

}

void Push(T d)

{

Qin.Push(d);

}

bool Empty()

{

return Qin.Empty();

}

void Pop()

{

if (Empty())

{

Qin.Pop();

}

}

T& Top()

{

if (Empty())

{

Swap();

T ret = Qin.Front();

return ret;

}

}

void Swap()//对两个队进行改变

{

while (Qin.Size() > 1)

{

Qout.Push(Qin.Front());

Qin.Pop();

}

while (Qout.Empty())

{

Qin.Push(Qout.Front());

Qout.Pop();

}

}

private:

Queue<T> Qin;//最开始将元素放在Qin中

Queue<T> Qout;//桥梁作用,用于改变Qin保存元素的工具

};

/************************************/

void test()//输出检验

{

Stack<int> s1;

s1.Push(1);

s1.Push(3);

s1.Push(5);

s1.Push(7);

cout << s1.Top() << endl;

s1.Pop();

cout << s1.Top() << endl;

s1.Pop();

cout << s1.Top() << endl;

s1.Pop();

cout << s1.Top() << endl;

s1.Pop();

}

时间: 2024-10-01 11:26:06

两个队实现栈的相关文章

编程题目: 两个队列实现栈(Python)

感觉两个队列实现栈 比 两个栈实现队列 麻烦 1.栈为空:当两个队列都为空的时候,栈为空 2.入栈操作:当队列2为空的时候,将元素入队到队列1:当队列1位空的时候,将元素入队到队列2: 如果队列1 和 队列2 都为空的时候,那就选择入队到队列1. 3.出队操作:当两个队列都为空的时候,引发错误"栈为空": 当队列2位空的时候,如果队列1中只有一个元素,则直接将队列1中的元素出队: 如果队列1不止一个元素的时候,就将队列1的元素出队然后入队到队列2,知道队列1中只有一个元素,然后将队列1

剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈

题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能. 我们通过一个具体的例子来分析该队列插入和删除元素的过程.首先插入一个元素a,不妨先把它插入到stack1,此时stack1 中的元素有{a},stack2为空.再压入两个元素b和c,还是插入到stack1中,此时stack1中的元素有{a,b,c},其中c位于栈顶,而stack2仍然为空. 这个时候,我们试着删除从队列中删除一个元素.

两个栈实现队列+两个队列实现栈----java

两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后全部出stack1并进入stack2.实现队列的先进先出即:若stack2非空,我们需要的恰好再栈顶,出栈;若要给队列添加元素,即先进sack1,要出队时,若stack2不为空就出栈,为空时就把stack1全部进栈到stack2 二.两个队列实现一个栈 ps:图片原创于剑桥offer,来自网络 两个栈实现队列+两个队列实现栈----java,布布扣,bubuko.com

使用两个队列实现栈

废话:要找工作了,面试方面得做些准备了,刷一刷题应该没有坏处的,就从<剑指offer>开始吧. 第2.3.5节提到使用两个栈实现队列,相应的代码也已给出.练习题里有一道使用两个队列实现一个栈的题目,大体思路跟使用栈实现队列差不多,书里也给出了大致的思路.需要注意的一点是,如果每次入栈都选则将元素插入到第一个队列中,出队时先将前n-1个元素移交到第二个队列中,然后返回队列一中剩余的唯一一个元素,再将队列二中的元素又依次移交回队列一中,这样做未免效率过于低下. 事实上这样的思路我们可以看作是一直选

Algorithm --&gt; 两个栈实现队列和两个队列实现栈

两个栈实现队列和两个队列实现栈 队列(queue)先进先出的线性表:栈(stack)先进后出的线性表. 两个栈实现队列 法一思路: s1是入栈的,s2是出栈的. 入队列:直接压入s1即可: 出队列:如果s2不为空,把s2中的栈顶元素直接弹出:否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素. 代码: #include <stack> #include <iostream> #include <cassert> using namespace std; te

用两个栈实现队列和用两个队列实现栈

题目一:用两个栈实现队列,队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列的尾部插入节点和在队列的头部删除节点的功能. template <class T> class CQueue { CQueue(); ~CQueue(); void appendTail(const T& node); T deleteHead(); private: stack<T> stack1; stack<T> stack2; }; 如上

7 两个栈模拟队列,两个队列模拟栈

利用两个栈模拟队列 stack1,stack2 首先向stack1当中放入数据,如果需要输出数据,从stack2中delete数据,如果stack2为空,就把stack1中数据导入stack2 <span style="font-size:14px;">#include "static.h" #include <iostream> #include <stack> template<typename T> class

用两个队列实现栈

[要求] 用两个队列queue1,queue2来实现栈的压栈和出栈功能. [分析] 此问题类似于用两个栈实现队列的功能的思路,将队列queue1作为入栈专职,queue2作为中转,主要思路是,压栈时将所有元素全部进队queue1,出栈时由于要将queue1最后一个进来的元素输出,所以先将queue1除最后一个元素以外的所有元素转到queue2,出队输出最后一个元素后,将queue2所有元素出队,重新入队到queue1,从而实现栈的后进先出功能. [举例] abcde依次入队,就能实现入栈:若要出

两个队列实现栈

http://www.cnblogs.com/kaituorensheng/archive/2013/03/02/2939690.html //前提已知 typedef struct queue { int queuesize; int head, tail; int *q; }Queue; void InitQueue(Queue *q); void EnQueue(Queue *q, int key); int DeQueue(Queue *q); int SizeOfQueue(Queue