leetcode刷题 232, 225, 20, 1047
232.用栈实现队列
使用栈实现队列的下列操作:
push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。
说明:
你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。
class MyQueue {//栈1用于调整顺序实现先进先出,栈2用于暂时存储进入的元素
public:
stack<int> s1;
stack<int> s2;
MyQueue() {
}
void push(int x) {
s2.push(x);
}
int pop() {
if(s1.empty()){//如果栈1全空,则将现在栈2所有的元素都分别出栈,并分别压入栈1中
while(!s2.empty()){
s1.push(s2.top());
s2.pop();
}
}
int x;
if(!s1.empty()){
x = s1.top();
s1.pop();
return x;
}
return -1;
}
int peek() {
if(s1.empty()){
while(!s2.empty()){
s1.push(s2.top());
s2.pop();
}
}
int x = s1.top();
return x;
}
bool empty() {
return s1.empty() && s2.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();
*/
225. 用队列实现栈
使用队列实现栈的下列操作:
push(x) -- 元素 x 入栈
pop() -- 移除栈顶元素
top() -- 获取栈顶元素
empty() -- 返回栈是否为空
注意:
你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。
class MyStack {//出栈时将非空队列的元素除最后一个元素都放入另一个队列中,剩余的最后一个元素就是栈顶的元素
public:
queue<int> q1;
queue<int> q2;
MyStack() {
}
void push(int x) {
if(!q1.empty())
q1.push(x);
else
q2.push(x);
}
int pop() {
if(empty())
return -1;
int x;
if(!q1.empty()){
while(q1.size() != 1){
x = q1.front();
q1.pop();
q2.push(x);
}
x = q1.front();
q1.pop();
}
else{
while(q2.size() != 1){
x = q2.front();
q2.pop();
q1.push(x);
}
x = q2.front();
q2.pop();
}
return x;
}
int top() {
if(empty())
return -1;
int x;
if(!q1.empty()){
while(q1.size() != 1){
x = q1.front();
q1.pop();
q2.push(x);
}
x = q1.front();
q1.pop();
q2.push(x);
}
else{
while(q2.size() != 1){
x = q2.front();
q2.pop();
q1.push(x);
}
x = q2.front();
q2.pop();
q1.push(x);
}
return x;
}
bool empty() {
return q1.empty() && q2.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();
*/
20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
class Solution {
public:
bool isValid(string s) {
stack<char> st;
char ch;
for(int i = 0; i < s.size(); ++i){
switch(s[i]){
case '(':
case '{':
case '[':
st.push(s[i]);
break;
case ')':
if(!st.empty() && st.top() == '(')
st.pop();
else
return false;
break;
case '}':
if(!st.empty() && st.top() == '{')
st.pop();
else
return false;
break;
case ']':
if(!st.empty() && st.top() == '[')
st.pop();
else
return false;
break;
}
}
return st.empty();
}
};
1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca"
输出:"ca"
解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
提示:
1 <= S.length <= 20000
S 仅由小写英文字母组成。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
if(s.size() > 0)
st.push(s[0]);
for(int i = 1; i < s.size(); ++i){
if(!st.empty() && st.top() == s[i])
st.pop();
else
st.push(s[i]);
}
string s1;
while(!st.empty()){
s1 += st.top();
st.pop();
}
reverse(s1.begin(), s1.end());
return s1;
}
};
也可直接将要返回的字符串作为栈直接进行操作
class Solution {
public:
string removeDuplicates(string s) {
string s1;
for(char ch : s){
if(s1.empty() || ch != s1.back())
s1.push_back(ch);
else
s1.pop_back();
}
return s1;
}
};
浙公网安备 33010602011771号