题目描述
实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
输入描述:
第一行输入一个整数N,表示对栈进行的操作总数。
下面N行每行输入一个字符串S,表示操作的种类。
如果S为"push",则后面还有一个整数X表示向栈里压入整数X。
如果S为"pop",则表示弹出栈顶操作。
如果S为"getMin",则表示询问当前栈中的最小元素是多少。
输出描述:
对于每个getMin操作,输出一行表示当前栈中的最小元素是多少。
备注:
1<=N<=1000000
-1000000<=X<=1000000
数据保证没有不合法的操作
示例1
输入
6
push 3
push 2
push 1
getMin
pop
getMin
输出
1
2
思路:
维护两个栈s,mins,时刻保持s和mins的size相同,s记录原始输入数据,mins.back()表示当前相同size的s的最小值
push的时候若num小于mins.back(),则push num到mins,否则将mins.back()再push一遍
pop的时候两个栈同时弹出即可
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class sstack{
private:
vector<int64_t> s;
vector<int64_t> mins;
public:
void push(int64_t num){
s.push_back(num);
if(mins.empty()) mins.push_back(num);
else{
if(s.back()<mins.back()) mins.push_back(num);
else mins.push_back(mins.back());
}
}
void pop(){
if(s.empty()) return;
mins.pop_back(); /* 每个mins.back()对应s.back()到s.front()的最小值 */
s.pop_back();
}
int64_t getMin(){
return mins.back();
}
};
static sstack ans;
int main()
{
int N;
cin>>N;
string cmd;
int64_t num;
while(N--){
cin>>cmd;
if(cmd=="push"){
cin>>num;
ans.push(num);
}
if(cmd=="pop") ans.pop();
if(cmd=="getMin") cout<<ans.getMin()<<endl;
}
return 0;
}