class MyQueue {
public:
stack<int> in;
stack<int> out;
MyQueue() {
}
void push(int x) {
in.push(x);
}
int pop() {
if(out.empty()){
while(!in.empty()){
out.push(in.top());
in.pop();
}
}
int result=out.top();
out.pop();
return result;
}
int peek() {
int result=this->pop();
out.push(result);
return result;
}
bool empty() {
if(in.empty()&&out.empty()){
return true;
}
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();
*/
为什么pop的部分不在pop之后把元素从out中吐回in呢,乍一想可能有点抽象,因为就算吐回in后下次pop时最后压入out的元素依然是in的底部,也就是吐回in前,out的顶部,所以不把元素搬回in也完全没影响。
class MyStack {
public:
queue<int> q1;
MyStack() {
}
void push(int x) {
q1.push(x);
}
int pop() {
queue<int> q2;
int size=q1.size();
while(--size){
q2.push(q1.front());
q1.pop();
}
int result=q1.front();
q1.pop();
q1=q2;
return result;
}
int top() {
int result=this->pop();
q1.push(result);
return result;
}
bool empty() {
if(q1.empty()){
return true;
}
return false;
}
};
/**
* 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();
*/
class Solution {
public:
bool isValid(string s) {
stack<char> kh;
for(int i=0;i<s.size();i++){
if(s[i]=='('||s[i]=='{'||s[i]=='['){
kh.push(s[i]);
}else{
if(kh.empty()){
return false;
}
if(s[i]!=kh.top()+1&&s[i]!=kh.top()+2){
return false;
}
kh.pop();
}
}
if(kh.empty()){
return true;
}
return false;
}
};
'('+1=')', '['+2=']', '{'+2='}'。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> result;
for(int i=s.size()-1;i>=0;i--){
if(!result.empty()){
if(s[i]==result.top()){
result.pop();
}else{
result.push(s[i]);
}
}else{
result.push(s[i]);
}
}
int i=0;
while(!result.empty()){
s[i++]=result.top();
result.pop();
}
s.resize(i);
return s;
}
};
将字符串压入堆栈前看栈顶字符是不是和要压入的字符一样,如果一样代表两字符相邻且相等,将栈顶字符弹出,如此往复,直到遍历完字符串即可。