标签:有用 自己的 依次 题目 学习 标记 code 队列 描述
一 题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
二 解法1
1 分析
队列的特点是队尾进、队头出,先进先出的结构。而栈是栈顶入栈、栈顶出栈,先进后出的结构。所有用两个栈实现一个队列,那么这两个栈需分别存放入栈顺序队列元素,另一个栈存放相反顺序的队列元素。实现的关键是保持这两个栈内存放的元素相同,顺序相反。
入队操作:首先将新元素存放在stack1中,然后将stack2中元素依次弹出并入栈到stack1中知道stack2为空,接下来将新元素如空栈stack2,最后将原来stack2中的元素依次从stack1中弹出还原到stack2中。出队操作类似的:就是首先获取一下stack2的栈顶元素作为标记,然后将stack1元素全部存放到stack2中,在stack2中完成两次出栈操作。
入队出队操作的复杂都为O(n)。
2 代码实现
1 class Solution 2 { 3 4 /*思路:用stack1保存入队元素,stack2保存出队元素。入队、出队的复杂度都为O(n)的复杂度*/ 5 6 public: 7 void push(int node) { 8 //先将元素存入stack1中 9 stack1.push(node); 10 //更新stack2中的数据,如果stack2不为空,先清空,再将stack1的元素先弹出再入stack2 11 int temp; 12 while (!stack2.empty()) { 13 temp = stack2.top(); 14 stack1.push(temp); 15 stack2.pop(); 16 } 17 //先将最新入队的元素入栈stack2 18 stack2.push(node); 19 //将原先栈stack2中的元素依次入栈 20 while (node != (temp = stack1.top())) { 21 stack2.push(temp); 22 stack1.pop(); 23 } 24 } 25 26 int pop() { 27 //如果stack2为空栈 28 29 //如果stack2不为空,获取队尾元素 30 int ret = stack2.top(); 31 //将stack1中所有元素入stack2中 32 int temp; 33 while (!stack1.empty()) { 34 temp = stack1.top(); 35 stack1.pop(); 36 stack2.push(temp); 37 } 38 //将除队尾元素外的其它元素入栈stack1 39 stack2.pop(); 40 while (ret != (temp = stack2.top())) { 41 stack2.pop(); 42 stack1.push(temp); 43 } 44 //将stack2中的队尾元素弹出 45 stack2.pop(); 46 47 return ret; 48 } 49 50 private: 51 stack<int> stack1; 52 stack<int> stack2; 53 };
其实出队操作时要考虑stack2为空时的异常处理,但是在牛客网提交时一直报错。
1 if (stack1.empty()) 2 throw exception("queue is empty.");
3 代码实现时的模糊点
① 有关stack的操作。
该篇博客是自己的学习总结,水平有限,如有错误,欢迎讨论!
标签:有用 自己的 依次 题目 学习 标记 code 队列 描述
原文地址:https://www.cnblogs.com/zpchya/p/11394139.html