剑指Offer-9-用两个栈实现队列

我们知道,栈是“先进后出”而队列是“先进先出”,那么要用两个栈来实现队列想必就是通过对栈中元素进行倒腾来实现

思路

假设两个栈:stack1stack2
入队元素压入stack1
出队操作:

  1. 若stack2为空,则弹出stack1中的所有元素并压入stack2中,这样第一个弹出的便是最先进入栈中的元素
  2. 若stack2不为空,则直接弹出stack2的栈顶元素

编码

哈哈哈哈,信心满满准备开敲,结果看了半天题目输入输出都看不懂😂
去翻了评论,还真就不止我一个,原来大家都是啊,那我就放心了

class CQueue
{
public:
    CQueue(){
    }

    void appendTail(int value){
        s1.push(value);
    }

    int deleteHead(){
        if (s2.empty()){
            if (s1.empty()){
                return -1;
            }
            while (!s1.empty()){
                s2.push(s1.top());
                s1.pop();
            }
        }
        int temp = s2.top();
        s2.pop();
        return temp;
    }
private:
    stack<int> s1, s2;
};

就是因为只有stack2空了才会再去stack1里面去,这样就避免了顺序混乱导致的结果错误
image


2023/1/29

如何用两个栈来实现队列操作?
我们知道栈是“先进后出”,而队列是“先进先出”

如果是入队的话,其实怎么保存都可以,存起来就完事儿了
问题是出,要解决上面的矛盾

class CQueue {
private:
	// 构造函数中初始化两个栈
	stack<int> stk1;
	stack<int> stk2;
public:
	CQueue() {
	}

	void appendTail(int value) {	
		stk1.push(value);
	}

	int deleteHead() {
		if (stk2.empty()) {
			if (stk1.empty()) return -1;
			while (!stk1.empty()) {
				stk2.push(stk1.top());
				stk1.pop();
			}
		}
		int res = stk2.top();
		stk2.pop();
		return res;
	}
};

所有的逻辑写在delete中,注意两个成员栈写成私有更严谨
居然写出来和上面一摸一样

posted @ 2022-04-15 17:31  YaosGHC  阅读(34)  评论(0)    收藏  举报