[剑指Offer笔记]07 栈和队列 QueueWithTwoStacks

[剑指Offer笔记]07 栈和队列

  • 栈: 先进后出 / 后进先出
  • 一般不考虑排序: 需要O(n)时间找到最大/最小值

队列

  • 队列: 先进先出 / 后进后出
  • 在按层次遍历树的时候需要用到!

题目描述:

  • 用两个栈来实现一个队列,完成队列的Push和Pop操作。
  • 队列中的元素为int类型。

分析:

  • 方法1:

    在push时做额外操作,就是将stack1压入stack2,node放入stack1底部,再将stack2重新压回stack1;

  • 方法2:

    压入堆栈的时候,就直接压入s1;
    但是出队的时候,需要将s1的压入s2(若s2为空),再出队
    s2不为空,则可以直接有栈顶元素出队

实现1:


namespace pro7_1{
	// 我的笨方法!
	// 只在push时做额外操作,就是将stack1压入stack2,node放入stack1底部,再将stack2重新压回stack1;
	class Solution{
	public:
		void push(int node) {
			while(stack1.size()) { 
				stack2.push(stack1.top());
				stack1.pop();
			}
			stack1.push(node);
			while (stack2.size()) {
				stack1.push(stack2.top());
				stack2.pop();
			}
		}

		int pop() {
			int result = 0;
			if (stack1.size()) {
				result = stack1.top();
				stack1.pop();
			}
			return result;
		}

	private:
		stack<int> stack1;
		stack<int> stack2;
	};
}

实现2:

namespace pro7_2 {
	// 比较优秀的方法:
	// stack1,stack2都充分的利用
	// 压入堆栈的时候,就直接压入s1;
	// 但是出队的时候,需要将s1的压入s2(若s2为空),再出队
	// s2不为空,则可以直接有栈顶元素出队
	class Solution {
	public:
		void push(int node) {
			stack1.push(node);
		}

		int pop() {
			if (stack2.empty()) {
				while (stack1.size()) {
					stack2.push(stack1.top());
					stack1.pop();
				}
			}
			int result = stack2.top();
			stack2.pop();
			return result;
		}

	private:
		stack<int> stack1;
		stack<int> stack2;
	};
}

做题体会:

  • 注意 if 和 while 别写错了!!!
  • 充分利用栈和队列的特点!!!

猜你喜欢

转载自blog.csdn.net/qjh5606/article/details/84500356