1.栈
栈遵循先入后出的原则。
函数:
stack.pop();//出栈,弹出最上层的元素,但是返回值为空。
stack.top();//返回最上层的元素的值。
stack.push(Type x);//将元素x入栈
stack.empty();//判断这个栈是否为空
stack.size();//返回这个栈的长度。
2.队列
队列遵循先入先出的原则。
函数:
queue.pop();//出队列,弹出最前面的元素,但返回值为空
queue.front();//返回最前面的元素的值。
queue.back();//返回最后面的元素的值。
queue.empty();queue.size();//类似于前面的栈
3.用栈实现队列
思路:用两个栈实现队列。
方法:对于入栈来说,直接放入stdIn中,对于出栈来说,我们先判断这个stdOut这个栈是不是空,如果不为空,直接输出最上面那个元素,如果为空,那么就将stdIn中的元素全部倒入到stdOut中,然后输出最上面的元素。
class MyQueue {
public:
stack<int> stdIn;
stack<int> stdOut;
MyQueue() {
}
void push(int x) {
stdIn.push(x);
}
int pop() {
if(stdOut.empty()){
while(!stdIn.empty()){
stdOut.push(stdIn.top());
stdIn.pop();
}
}
int result = stdOut.top();
stdOut.pop();
return result;
}
int peek() {
if(stdOut.empty()){
while(!stdIn.empty()){
stdOut.push(stdIn.top());
stdIn.pop();
}
}
return stdOut.top();
}
bool empty() {
if(stdIn.empty()&&stdOut.empty()){
return true;
}else{
return false;
}
}
};
/**
* 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();
*/
4.用队列实现栈
思路:使用一个队列来实现栈。
实现:入栈等同。
出栈的时候,将出队列的元素重新又压入队列同时进行类似于循环队列,我们只需要将需要的那元素放到队列最前方再出队列即可,那么此时移动的次数正好就是队列的长度-1(queue.size()-1)。从而实现出栈。
由于队列可以获得两端的值,所以对于栈来说的栈顶元素实际上是队列的最后一个,直接用queue.back()即可获取。
注释中使用的是两个队列来完成入栈和出栈,对于出栈的时候,我们先将出队列的元素存放到另外一个队列中,然后留下最后一个,出队列即为我们需要的那个元素,然后将另外一个队列的元素重新压回队列,并清除另外一个队列里面的元素(保证代码的一致性,如果你不重新压回去的话,你下次就不知道到底是向哪一个队列入栈,哪一个队列出栈)。
class MyStack {
public:
/*
queue<int> stdIn;
queue<int> stdOut;
MyStack() {
}
void push(int x) {
stdIn.push(x);
}
int pop() {
int size = stdIn.size();
while(--size){
stdOut.push(stdIn.front());
stdIn.pop();
}
int result = stdIn.front();
stdIn.pop();
stdIn = stdOut;
while(!stdOut.empty()){
stdOut.pop();
}
return result;
}
int top() {
return stdIn.back();
}
bool empty() {
return stdIn.empty();
}*/
queue<int> queue;
MyStack() {
}
void push(int x) {
queue.push(x);
}
int pop() {
int size = queue.size();
while(--size){
queue.push(queue.front());
queue.pop();
}
int result = queue.front();
queue.pop();
return result;
}
int top() {
return queue.back();
}
bool empty() {
return queue.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();
*/