題目一:用兩個(gè)棧實(shí)現(xiàn)隊(duì)列功能
題目二:用過兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)棧的功能
解析:由于棧是先進(jìn)后出,所以push的時(shí)候想用stack 入棧旬牲,當(dāng)要pop的時(shí)候 因?yàn)橐〉膶?shí)際上是棧的最后一個(gè)醇王,所以把stack1 的數(shù)據(jù)都push到stack2里呢燥,最后為實(shí)際數(shù)據(jù),實(shí)際pop的是stack2的數(shù)據(jù)寓娩, 當(dāng)有新數(shù)據(jù)push的時(shí)候,可以繼續(xù)放到stack1中呼渣,不用每次都push到stack2中棘伴,只有當(dāng)stack2為空時(shí),進(jìn)行一次轉(zhuǎn)換即可屁置。
隊(duì)列轉(zhuǎn)棧部分稍微復(fù)雜焊夸,push的時(shí)候還是存到queue1中,當(dāng)需要pop時(shí)蓝角,把queue1的數(shù)據(jù)push到queue2中阱穗,直到queue1中剩一個(gè)數(shù)據(jù),這個(gè)數(shù)據(jù)即為返回結(jié)果使鹅,為了方便理解揪阶,然后把queue2的數(shù)據(jù)在push到queue1中,這樣每次pop的時(shí)候都要進(jìn)行一次顛倒患朱,既可以實(shí)現(xiàn)該功能鲁僚。
#include <iostream>
#include "stack"
#include "queue"
using namespace std;
//題目一
class Solution {
private:
stack<int> stack1;
stack<int> stack2;
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if (stack2.empty()) {
while (!stack1.empty()) {
int val = stack1.top();
stack1.pop();
stack2.push(val);
}
}
int val = stack2.top();
stack2.pop();
return val;
}
};
//題目二
class queueClass {
private:
queue<int> queue1;
queue<int> queue2;
public:
void push(int node) {
queue1.push(node);
}
int pop() {
int i = queue1.size();
for (int n=0; n<i-1; n++) {
queue2.push(queue1.front());
queue1.pop();
}
int val = queue1.front();
queue1.pop();
while (!queue2.empty()) {
queue1.push(queue2.front());
queue2.pop();
}
return val;
}
};
int main(int argc, const char * argv[]) {
queueClass * a = new queueClass();
a->push(1);
a->push(2);
a->push(3);
a->push(4);
a->push(5);
a->push(6);
std::cout << a->pop()<<endl;
std::cout << a->pop()<<endl;
std::cout << a->pop()<<endl;
return 0;
}