栈和队列基础理论 :
栈(stack):第一个进最后一个出
队列(queue):这个跟排队一样,第一个进第一个出
今天来做有关于栈和队列的题目
第一题
232.用栈实现队列
这道题用栈的方式来实现队列,但是我们需要用到两个栈。一个栈用来存储一开始的元素,另一个栈用来输出。要实现queue中的方法我们就得巧妙的使用这两个栈。首先是push方法,这个跟栈中的push方法没有区别,所以直接使用栈的push方法。然后是pop方法,由于队列是从前面开始取出,而栈是从最后面开始取出,我们可以使用输出栈来存储倒过来的输入栈,最后再将最左边的元素给取出就行。再就是peek方法,获取到栈里面的第一个元素,我们可以用之前写的pop方法获取到最左边的元素,最后再将这个元素加回去即可。最后是empty方法,只要输出栈和输入栈都为空的,那么此时才算空。
class MyQueue {
public:
stack<int> sti;//创建输入栈
stack<int> sto;//创建输出栈
MyQueue() {
}
void push(int x) {//push方法
sti.push(x);//使用stack 自带的push方法即可
}
int pop() {//pop方法
if(sto.empty()){
while(!sti.empty()){//遍历输入栈
sto.push(sti.top());//将反过来的输入栈元素放入输出栈
sti.pop();//将元素从输入栈取出
}
}
int r = sto.top();//获取到输出栈最右边的元素,也就是第一个元素要被取出
sto.pop();//取出这个元素
return r;
}
int peek() {//peek方法
int r = this->pop();//使用pop方法获取最右边的元素
sto.push(r);//因为只是找到第一个元素,不需要取出所以将这个元素再放入输出栈
return r;
}
bool empty() {
return sti.empty() && sto.empty();//如果输出栈和输入栈都为空才是真的空了
}
};
第二题
225. 用队列实现栈
这道题和第一题非常的相似,只不过是用队列的方式来实现栈。同样我们得使用两个队列,一个输入队列,一个是输出队列。
class MyStack {
public:
queue<int> qui;//创建输入队列
queue<int> quo;//创建输出队列
MyStack() {
}
void push(int x) {
qui.push(x);//使用queue自带的push方法
}
int pop() {
//虽然我们可以获取到queue的最后一个元素但是无法从后面进行删除
//所以我们可以使用队列的大小,从前面开始进行删除直到最后一个元素
int size = qui.size();//获取队列的大小
size--;//要保留下最后一个元素
while(size--){//遍历剩下的元素
quo.push(qui.front());//将输入队列里除了最后一个元素的其他元素都放入输出队列中
qui.pop();
}
int r = qui.front();//获取到输入队列里剩下的最后一个元素
qui.pop();//此时输入队列为空
qui = quo;//我们将输出队列赋值给输入队列以便下次使用pop方法
while(!quo.empty()) quo.pop();//清空输出队列
return r;
}
int top() {
return qui.back();//找到栈的最后一个元素可以用队列现有的方法back()获取到最后一个元素
}
bool empty() {
return qui.empty();
//在pop方法中,都是从输入队列开始的,并且输入队列在最后被输出队列赋值,
//但是在删除元素的过程中输出队列中的元素会越来越少直到没有元素
//此时输入队列也会没有任何元素,也就是真的空了。
}
};