使用栈来组成队列
stack
232. 用栈实现队列
脑壳里去模拟一下栈的操作,先入先出。
1.添加元素直接push就可以。
2.pop出栈操作,就会复杂一点,我们现在需要的是移除并且返回栈底的最后一个元素,我们需要将门前栈前面的n-1个元素全部放入一个新的栈中,通过循环size--来找到最后一个元素,记录最后一个元素并且不将这个元素放入辅助栈,然后将辅助栈的元素放回原来的正确的栈中。
3.获取队头元素,使用已有的pop函数,弹出,再push放入。
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
MyQueue() {
}
void push(int x) {//队列尾端怎加元素x
stIn.push(x);
}
int pop() {//出队列操作,移除+返回元素
//当stOut为空是,才能从stIn中导入数据,导入stin中的全部数据
if(stOut.empty()){
while(!stIn.empty()){
stOut.push(stIn.top());
stIn.pop();
}
}
int result = stOut.top();
stOut.pop();
return result;
}
int peek() {//返回队列开头的元素
int res = this->pop();
stOut.push(res);
return res;
}
bool empty() {//队列的判空操作,如果为空true,不空false
return stIn.empty()&&stOut.empty();
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
使用队列来实现栈
使用两个队列来实现栈
代码注释很清晰,望理解!
class MyStack {
public:
queue<int> que1;
queue<int> que2;//辅助队列
//由于我们目前使用两个队列来实现栈,队列讲究一个先入先出的序列,而我们的栈为后入先出,
//所以我们定义两个队列,用来备份出栈操作时候的数据,保存起来,
//再成功出栈并且记录数值后再来将备份后的数据重新添加到原队列。
MyStack() {
//栈嘛,就是先入先出的一种东西,
}
void push(int x) {//将元素放入栈顶
que1.push(x);
}
int pop() {//移除栈顶元素,并且保存这个值,返回回来,(出栈操作记录值)
int size = que1.size();
size --;//非常刻意的队列中留下一个元素作为保留!!!!!!!细节
while(size--){//循环将que1的数据导入que2中
que2.push(que1.front());//返回第一个元素
que1.pop();
}
int result = que1.front();//此处留下的最后一个元素。
que1.pop();//将最后一个元素也弄完
que1 = que2;
while (!que2.empty()){//循环清空que2
que2.pop();
}
return result;
}
int top() {//不移除元素,只返回这个值
return que1.back();
}
bool empty() {//判空操作
return que1.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
在实现过程中发现一个问题
front和back方法的使用不同之处。
a.front();
返回的是第一个元素的引用。a.back();
返回的的是最后一个元素的引用。
back是取值操作,而front是对于最后一个地址的操作
使用一个队列来实现栈
使用一个队列来实现,主要方法为获取队列大小,然后将队列出栈的元素重新从队尾来加进去,获取最后一个元素,来实现栈!!!!!
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size = que.size();
size --;//有心计的保留一位元素
while(size--){
que.push(que.front());
que.pop();
}
int result = que.front();//这里弹出的元素就是栈底的元素了
que.pop();
return result;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/