剑指offer 题目5

128 阅读1分钟

题目描述

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

大概思路

队列:先进先出 FIFO

栈 :后进先出 LIFO

给定两个栈,那么默认栈 1 来用来 push 数据,栈 2 用来 pop 数据。调用 pop 函数的时候,如果此时栈 2 为空栈 1 不为空,那么交换一下。如果都为空,那直接报错呗,都是这样处理的。 调用 push 函数的时候,如果此时栈 1 为空栈2不为空,那么交换一下,再 push 进去。

先判断一下再交换是因为可能同一时刻会连续出现多次调用一种方法,这样的话减少了交换带来的一些性能消耗。

代码

class Solution { public: void push(int node) { if (stack1.empty() && !stack2.empty()){ swap(stack2, stack1); }

	stack1.push(node);
}

int pop() {
	if (stack2.empty() && !stack1.empty()){
		swap(stack1, stack2);
	}

	int temp = stack2.top();
	stack2.pop();
	return temp;
}

void swap(stack<int> &soruce, stack<int> &target){
	int temp = 0;
	while (!soruce.empty()){
		temp = soruce.top();
		soruce.pop();
		target.push(temp);
	}
}

private: stack stack1; stack stack2; };

总结

题目算给的条件算是很明白了,如果只是说用栈来实现的话,可能会因为考虑内存消耗这些东西,反而一下不敢确定用两个栈,还是手动滑稽。