232.用栈实现队列
思路:用两个栈实现一个队列操作
入队操作:将数据直接压入其中一个栈中
出队操作:将其中一个栈中的元素压入另一个栈中,再将元素从另一个栈中弹出,这样就是实现了先进先出的操作。
获取队首元素:与出队操作大致相同,将一个栈中元素压入另一个栈中,然后通过stack.top()获取其中的元素
细节部分:
入队操作不是连续的,而是入队和出队操作间断进行的,那么出队操作就要进行一些逻辑判断操作,如果第二个栈不为空,就将第二个栈中的元素直接弹出,如果第二个栈为空,就将第一个栈中的所有元素压入第一个栈中。
获取队首元素也可以直接调用第二个出队函数,然后输出弹出的值,再将弹出的值压回栈顶
代码部分:
class MyQueue {
public:
//创建两个栈,压栈的时候压入其中一个栈之中,弹栈的时候,将一个栈中的元素弹到另一个栈中完成后,再从另一个栈中
//弹出来
MyQueue() {
// stack<int> q1,q2;
}
void push(int x) {
q1.push(x);
}
int pop() {
if(q2.empty())//如果q2是真的
//一定要保持先进先出的原则,所以要将q2中的元素弹出完全后才将q1中的元素导入q2.
while(q1.empty()==false){
q2.push(q1.top());
q1.pop();
}
int result=q2.top();
q2.pop();
return result;
}
int peek() {
int result=this->pop();
q2.push(result);
return result;
}
bool empty() {
if(q1.empty()&&q2.empty()){
return true;
}
return false;
}
private:
stack<int>q1,q2;
};
225.用队列实现栈
思路:用一个队列实现栈的操作
入栈操作:就将元素正常压入队列中。
出栈操作:先将最后一个入队元素之前的元素(n-1个元素)全部弹出,并加入队列的尾部,然后进行弹出操作。
获取栈顶元素:与出栈大致相同,也是将队中最后一个元素之前的元素进行弹出后再进行入队,然后front()函数进行获取栈顶元素
代码展示:
class MyStack {
public:
//用队列实现栈,
MyStack() {
}
void push(int x) {
que.push_back(x);
}
int pop() {
//将最后一个元素的前面元素全部弹出
int size=que.size();
size--;
while(size--){
//将前面弹出的元素加到最后的位置
que.push_back(que.front());
que.pop_front();
}
int result=que.front();
que.pop_front();
return result;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
private:
deque<int> que;
};
/**
* 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();
*/
20.有效括号
思路:
此题是使用栈的比较经典的题目,判断是否是有效括号,我们就要先考虑什么情况下括号不是有效的?推出以下三种括号无效的情况:
1.左边括号多了的情况 2.左右括号相等但是出现了括号类型匹配错误的问题 3.右边括号多出的情况
解决方法:遇到左括号就进行压栈操作,遇到右括号时,就匹配栈顶元素,如果匹配就进行弹栈操作。
用栈的数据结构模拟出这三种情况的发生,1.当出现第一种情况时,当字符串中括号遍历完成后,栈中仍然没空。 2.第二种情况发生当栈顶元素与字符串遍历到的元素不配对。 3.字符串遍历到右括号时栈中为空。
代码部分:
class Solution {
public:
bool isValid(string s) {
stack<int> my_stack;
for(int i=0;i<s.size();i++){
//遍历字符串
//这里为什么如果是左括号会压入对应的右括号,因为
//因为当遇到右括号时能够方便判断
if(s[i]=='('){
my_stack.push(')');
}else if(s[i]=='['){
my_stack.push(']');
}else if(s[i]=='{'){
my_stack.push('}');
}else if(my_stack.empty()||s[i]!=my_stack.top()){
return false;
}else{
my_stack.pop();
}
}
return my_stack.empty();
}
};