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

感觉两个队列实现栈 比 两个栈实现队列 麻烦

1.栈为空:当两个队列都为空的时候,栈为空

2.入栈操作:当队列2为空的时候,将元素入队到队列1;当队列1位空的时候,将元素入队到队列2;

  如果队列1 和 队列2 都为空的时候,那就选择入队到队列1.

3.出队操作:当两个队列都为空的时候,引发错误“栈为空”;

      当队列2位空的时候,如果队列1中只有一个元素,则直接将队列1中的元素出队;

      如果队列1不止一个元素的时候,就将队列1的元素出队然后入队到队列2,知道队列1中只有一个元素,然后将队列1中的元素出队即可。

      当队列1位空的时候,如果队列2中只有一个元素,则直接将队列2中的元素出队;

      如果队列2不止一个元素的时候,就将队列2的元素出队然后入队到队列1,知道队列2中只有一个元素,然后将队列2中的元素出队即可。

代码如下:

 1 #!/usr/bin/env python3
 2 # -*- coding: utf-8 -*-
 3
 4 class Stack(object):
 5         def __init__(self):
 6                 self.q1 = Queue()
 7                 self.q2 = Queue()
 8
 9         def is_empty(self):
10                 result = self.q1.is_empty() and self.q2.is_empty()
11                 return result
12
13         def push(self, elem):
14                 if self.q2.is_empty():
15                         self.q1.enqueue(elem)
16                 elif self.q1.is_empty():
17                         self.q2.enqueue(elem)
18                 else:
19                         self.q1.enqueue(elem)
20
21         def pop(self):
22                 if self.q1.is_empty() and self.q2.is_empty():
23                         raise ValueError("Stack is Empty")
24                 if self.q2.is_empty():
25                         if self.q1.head.next is None:
26                                 return self.q1.dequeue()
27                         while not self.q1.head.next is None:
28                                 self.q2.enqueue(self.q1.dequeue())
29                         return self.q1.dequeue()
30                 if self.q1.is_empty():
31                         if self.q2.head.next is None:
32                                 return self.q2.dequeue()
33                         while not self.q2.head.next is None:
34                                 self.q1.enqueue(self.q2.dequeue())
35                         return self.q2.dequeue()
36
37
38 class Node(object):
39         def __init__(self, elem, next_=None):
40                 self.elem = elem
41                 self.next = next_
42
43 class Queue(object):
44         def __init__(self):
45                 self.head = None
46                 self.rear = None
47
48         def is_empty(self):
49                 return self.head is None
50
51         def enqueue(self, elem):
52                 if self.is_empty():
53                         self.head = Node(elem)
54                         self.rear = self.head
55                 else:
56                         self.rear.next = Node(elem)
57                         self.rear = self.rear.next
58
59         def dequeue(self):
60                 if self.is_empty():
61                         raise ValueError("Queue is Empty")
62                 if self.head.next is None:
63                         e = self.head.elem
64                         self.head = None
65                         self.rear = None
66                         return e
67                 else:
68                         e = self.head.elem
69                         self.head = self.head.next
70                         return e
71
72         def peek(self):
73                 if self.is_empty():
74                         raise ValueError("Queue is Empty")
75                 return self.head.elem
76
77         def bianli(self):
78                 p = self.head
79                 li = []
80                 while p:
81                         li.append(p.elem)
82                         p = p.next
83                 return li
84
85 if __name__ == "__main__":
86         s = Stack()
87         for i in range(5):
88                 s.push(i)
89         while not s.is_empty():
90                 print(s.pop())
时间: 2024-10-06 21:39:12

编程题目: 两个队列实现栈(Python)的相关文章

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

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

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

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

使用两个队列实现栈

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

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

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

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

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

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

剑指offer (7) 两个栈实现队列 两个队列实现栈

题目:用两个栈实现一个队列. 队列的声明如下,请实现它的两个函数 appendTail 和  deleteHead,分别完成队列尾部插入结点 和 队列头部删除结点 AppendTail:直接将元素入栈stack1 DeleteHead:当stack2中不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出 如果stack2为空,我们把stack1中的元素逐个弹出并入栈stack2,由于先进入队列的元素被压到stack1的底端,经过弹栈和压入stack2之后就处于stack2的顶端 1

用两个队列实现栈

[要求] 用两个队列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