码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-06-07 07:06:14      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:des   c   style   class   blog   code   

题目:用两个栈实现一个队列.

队列的声明如下,请实现它的两个函数 appendTail 和  deleteHead,分别完成队列尾部插入结点 和 队列头部删除结点

bubuko.com,布布扣 

 

AppendTail:直接将元素入栈stack1

DeleteHead:当stack2中不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出

                   如果stack2为空,我们把stack1中的元素逐个弹出并入栈stack2,由于先进入队列的元素被压到stack1的底端,经过弹栈和压入stack2之后就处于stack2的顶端

bubuko.com,布布扣
 1 #include <stack>
 2 #include <stdexcept>
 3 
 4 template <typename T>
 5 class MyQueue {
 6     public:
 7         MyQueue();
 8         ~MyQueue();
 9 
10         void AppendTail(const T& node);
11         T    DeleteHead();
12 
13     private:
14         std::stack<T> stack1;
15         std::stack<T> stack2;
16 };
17 
18 template<typename T>
19 void MyQueue<T>::AppendTail(const T& node)
20 {
21     stack1.push(node);
22 }
23 
24 template<typename T>
25 T MyQueue<T>::DeleteHead()
26 {
27     if (stack2.size() <= 0) {
28         while (stack1.size() > 0) {
29             T& data = stack1.top();
30             stack1.pop();
31             stack2.push(data);
32         }
33     }
34     if (stack2.empty) {
35         throw runtime_error("queue is empty");
36     }
37 
38     T head = stack2.top();
39     stack2.pop();
40     return head;
41 }
bubuko.com,布布扣

 

题目:用两个队列实现一个栈.

栈的声明如下,请实现它的两个函数 Push 和  Pop,分别完成入栈 和 出栈 功能

bubuko.com,布布扣 

 

入栈:仅将元素push到 非空队列

出栈:将非空队列的元素逐个出队列,并且将 除了最后一个元素的其余所有元素 push到 另外的空队列

bubuko.com,布布扣
 1 #include <stack>
 2 #include <stdexcept>
 3 
 4 template <typename T>
 5 class MyStack {
 6     public:
 7         MyStack();
 8         ~MyStack();
 9 
10         void Push(const T& data);
11         void Pop();
12     private:
13         std::queue<T> queue1;
14         std::queue<T> queue2;
15 };
16 
17 template <typename T>
18 void MyStack<T>::Push(const T& data)
19 {
20     if (queue1.empty() && queue2.empty())  queue1.push(data);
21     if (queue1.empty() && !queue2.empty()) queue2.push(data);
22     if (!queue1.empty() && queue2.empty()) queue1.push(data);
23     if (!queue1.empty() && !queue2.empty()) throw runtime_error("tow queues cannot non-empty at same time");
24 }
25 template <typename T>
26 void MyStack<T>::Pop()
27 {
28     if (queue1.empty() && queue2.empty()) {
29         throw runtime_error("two queues are empty");
30     }
31 
32     if (!queue1.empty() && !queue2.empty()) {
33         throw runtime_error("two queues cannot non-empty at same time");
34     }
35 
36     if (!queue1.empty() && queue2.empty()) {
37         int nNodes = queue1.size();
38         int i = 0;
39         while (!queue1.empty()) {
40             T& node = queue1.front();
41             queue1.pop();
42             if (i < nNodes - 1) {
43                 queue2.push(node);
44                 ++i;
45             }
46         }
47     }
48 
49     if (queue1.empty() && !queue2.empty()) {
50         int nNodes = queue2.size();
51         int i = 0;
52         while (!queue2.empty()) {
53             T& node = queue2.front();
54             queue2.pop();
55             if (i < nNodes - 1) {
56                 queue1.push(node);
57                 ++i;
58             }
59         }
60     }
61 }
bubuko.com,布布扣

 

剑指offer (7) 两个栈实现队列 两个队列实现栈,布布扣,bubuko.com

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

标签:des   c   style   class   blog   code   

原文地址:http://www.cnblogs.com/wwwjieo0/p/3770574.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!