【面试题】栈的压入,弹出队列

题目

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列

在这里插入图片描述

我自己的一个栈一个队列实现

因为栈和队列的性质
栈是后进先出,队列是先进先出
所以我们正好可以利用这两个性质,对应题目给出来的两个数组进行操作
首先我们把popped里边的所有值压入一个队列中,由于队列的性质,出队顺序和入队顺序一样
我们遍历一次pushed数组
在遍历的同时我们比较压入的值和队列最顶端的值
如果栈为空并且压入的值和队列最顶端的值相同 我们不要压入栈 并且将队列最顶端的值弹出

如果栈不为空 则我们压入数据之前先栈顶的元素和队列顶端的元素相同
则我们弹出栈和队列最顶端的值

保证我们在压入栈之前 将和队列顶端值相等的元素都弹出

bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
       
stack<int> s;
	queue<int> q;
	for (int i = 0; i < popped.size(); i++) {
		q.push(popped[i]);
	}
	for (int i = 0; i < pushed.size(); i++) {
	
		if (pushed[i] != q.front()) {
			s.push(pushed[i]);
			//栈中压入
		}
		else {
			q.pop();//队列弹出一个
		}
		while ((!s.empty() && !q.empty()) && (q.front() == s.top())) {
			
			s.pop();
			q.pop();
		}
	}
	//添加完毕
	while (!s.empty() && !q.empty()) {
	
		if (s.top() == q.front()) {
			s.pop();
			q.pop();
		}
		else {
			return false;
		}
	}
	return  s.empty();
    }

在这里插入图片描述
可能时间复杂度和空间复杂度都比较高,但是这是我刚开始就想到的解法
所以就硬着头皮写下来了

一个栈的解法

后边看题解,发现一个栈也可以实现相同的工作
而且效率更高

bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
	stack<int> s;
	int k = 0;
	for (auto n : pushed) {
		s.push(n);
		while (!s.empty() && s.top() == popped[k]) {
			k++;
			s.pop();
		}
	}
	return s.empty();
}

在这里插入图片描述

希望我所写的对大家有所帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值