《从头再来》剑指offer.09 用两个栈实现队列
作者:互联网
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
如果学过一点基础的数据结构的话,我们可以知道队列和栈是两个不同的概念。
队列讲究的是FIFO,也就是先进先出,因为队列只能从一端添加元素,在另一端删除元素。允许添加元素的一端被称为队尾,允许删除元素的一端被称为队头。
栈讲究的是FILO,也就是先进后出,因为栈只能从一端添加元素,同时也只能在这一端删除元素。允许添加和删除元素的一端被称为栈顶。
用两个栈实现队列的基本思想是一个栈只用于添加元素(例如把它叫做左栈stackL),另一个栈用于辅助实现删除元素(把它叫做右栈stackR)。如果要添加元素,则直接在左栈添加即可(正常入左栈)。但是如果要删除元素的话,就不一样了,因为栈只能删除栈顶的元素,但是此处的删除元素显然说的是删除栈底的元素,此时就需要借助右栈来帮助实现这个目的了。第一步,先将左栈的所有元素出栈,压入右栈。此时右栈的栈顶元素即是原左栈的栈底元素,也就是我们要删除的元素。第二步,删除右栈的栈顶元素。第三步,将右栈剩余的元素出栈,按顺序压入左栈。即完成了两个栈实现队列的目的。
class CQueue { public: stack<int> stackL; stack<int> stackR; CQueue() { }//构造函数可以直接不写 void appendTail(int value) { //正常添加元素到左栈 stackL.push(value); } int deleteHead() { //三步 //第一步,移栈 while(!stackL.empty()){ int val = stackL.top(); stackR.push(val); stackL.pop(); } //第二步,删除元素 int result = -1;//注意这里的定义 if(!stackR.empty()){ result = stackR.top(); stackR.pop(); } //第三步,移栈 while(!stackR.empty()){ int val = stackR.top(); stackL.push(val); stackR.pop(); } return result; } }; /** * Your CQueue object will be instantiated and called as such: * CQueue* obj = new CQueue(); * obj->appendTail(value); * int param_2 = obj->deleteHead(); */
《从头再来》
标签:stackL,从头再来,删除,队列,offer.09,元素,左栈,stackR 来源: https://www.cnblogs.com/azie420/p/14853679.html