队列与栈面试题C++

概念

1.图的深度优先遍历(DFS)
可以用栈实现,从根结点开始沿左孩子到最深的节点压入栈中,然后依次弹出,若栈顶节点还有没有访问的孩子,则没访问过得孩子入栈直到最深的节点,然后再弹出。元素入栈顺序则为深度优先遍历顺序。
2.图的宽度优先遍历(BFS)
可以用队列实现,将根结点放入队列,每弹出一个节点,就将该节点的孩子全部放入队列,放入队列的顺序为宽度优先遍历顺序。

示例一

实现一个特殊的栈,在实现栈的基础功能的基础上,再实现返回栈中最小元素的操作getMin。
要求:1.pop,push,getMin操作的时间复杂度都为 O ( 1 ) O(1) O(1)
2.设计的栈类型可以使用现成的栈结构。
分析:
思路一:构造两个栈,一个stackData存储数据,一个stackMin存储当前的最小值,只有当前数小于等于stackMin的栈顶元素时,该数放入stackMin中,否则不压入,当弹出时,若stackData栈顶等于stackMin时,stackMin才弹出,否则不弹出。

template <typename T> class newStack {
public:
	std::stack<T> stackData;
	std::stack<T> stackMin;
	void push(T data) {
		stackData.push(data);
		if (stackMin.empty())
		{
			stackMin.push(data);
		}
		else
		{
			if (data <= stackMin.top()) {
				stackMin.push(data);
			}
		}
	}
	void pop() {
		if (!stackData.empty()) {
			if (stackData.top() == stackMin.top()) {
				stackMin.pop();
			}
			stackData.pop();
		}
	}
	T top();
	T getMin();
	bool empty();

};
template <typename T> T newStack<T>::top() {
	return stackData.top();
}
template <typename T> T newStack<T>::getMin() {
	return stackMin.top();
}
template <typename T> bool newStack<T>::empty() {
	return stackData.empty();
}

思路二:构造两个栈,一个stackData存储数据,一个stackMin存储当前的最小值,每次压入数据时两个栈都压入,stackData压入给定数据,stackMin压入给定数据或stackMin栈顶元素较小的那个,弹出时两个栈一起弹出。

template <typename T> class newStack {
public:
	std::stack<T> stackData;
	std::stack<T> stackMin;
	void push(T data);
	void pop();
	T top();
	T getMin();
	bool empty();
};

template <typename T> void newStack<T>::push(T data) {
	stackData.push(data);
	if (stackMin.empty()) {
		stackMin.push(data);
	}
	else {
		if (stackMin.top() >= data) {
			stackMin.push(data);
		}
		else{
			stackMin.push(stackMin.top());
		}
	}
}
template <typename T> void newStack<T>::pop() {
	if (!stackData.empty()) {
		stackData.pop();
		stackMin.pop();
	}
}
template <typename T> T newStack<T>::top() {
	return stackData.top();
}
template<typename T> T newStack<T>::getMin() {
	return stackMin.top();
}
template<typename 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值