栈结构和队列结构
栈就是先进后出
队列就是先进先出
栈结构有什么操作
top()提取栈顶元素
pop()
弹出栈顶元素
push()
压元素进栈
empty()
判断是否为空
队列有什么操作?
peek()
返回队列首元素
front
back
232.用栈实现队列
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
MyQueue() {
}
void push(int x) {
stIn.push(x);
}
int pop() {
// 只有当stOut为空的时候,才能将stIn里的数据全部导入
if (stOut.empty()) {
// 从stIn导入数据直到stIn为空
while(!stIn.empty()) {
stOut.push(stIn.top());
//把stIn的栈顶压入stOut栈
stIn.pop();
//弹出stIn栈顶元素
}
}
int result = stOut.top();
stOut.pop();
return result;
}
int peek() {
int res = this->pop(); // 直接使用已有的pop函数
stOut.push(res); // 因为pop函数弹出了元素res,所以再添加回去
return res;
}
bool empty() {
return stIn.empty() && stOut.empty();
}
};
LeetCode:225. 用队列实现栈
每日懵逼
队列模拟栈
卡哥妙啊!
打开新世界
队列有size,要弹出的元素应该是队尾,那么就进行四次出队和入队,那么此时的队首元素就是栈的栈顶元素
1 2 3 4 5
5 1 2 3 4 弹5 弹size-1个元素
1 2 3 4
20. 有效的括号
只能说
跟着卡哥走
天下我有
读入括号压栈时对括号进行反向
在栈中的元素都是经过返向的
那么到真正读到右括号时,此时栈顶元素必相同,不然就返回false
[{()}]
1047. 删除字符串中的所有相邻重复项
妙啊
对对碰思想
以我的智力也就是写个for for了
使用栈 保存读过元素,如果读到下一个元素,看看栈顶元素,如果相同碰的消掉
abbaca
ca
class Solution {
public:
string removeDuplicates(string S) {
stack<char> st;
for (char s : S) {
if (st.empty() || s != st.top()) {
//不同就放进来
st.push(s);
} else {
//相同就碰的消掉
st.pop(); // s 与 st.top()相等的情况
}
}
string result = "";
while (!st.empty()) { // 将栈中元素放到result字符串汇总
result += st.top();
st.pop();
}
reverse (result.begin(), result.end()); // 此时字符串需要反转一下
return result;
}
};