话说前几天小q去公司面试…
面试官:知道栈这种数据结构吗?
小q:知道啊,balabala…
面试官:那好,现在请你实现这样一种栈,除了pop,top,push三个操作之外,还需要包括查询栈中最小值的min操作。
小q:那简单啊,查询最小值的时候遍历一遍栈就可以了。
面试官:…
面试官:今天面试就到这里,你回家等通知去吧。
…………………
毫无疑问,小q这次面试是死的不能再死了。为了避免重蹈覆辙,小q向身为ACMer的Zeratul求助。但是Zeratul刚在青岛打了铁,正在痛哭流涕无心回答问题,于是小q就找到了同为ACMer的你。你能帮他解决这个问题吗?
准备两个栈,一个是正常存数的,另一个为记录最小值得栈。
最小值的栈入栈条件:新来的数小于等于当前栈顶的元素。
最小值的栈出栈条件:弹栈的数等于当前栈顶的元素值。
注:最小值的栈的初值初始化为0x3F3F3F3F
代码:
#include <iostream>
#include <stdio.h>
#include <stack>
using namespace std;
int main()
{
stack<int> stack1;
stack<int> stackMin;
int stack1Num = 0;
int stackMinNum = 0;
int T;
int oper;
int operNum;
stackMin.push(0x3F3F3F3F);
scanf("%d",&T);
for(int i = 0;i < T;i ++){
scanf("%d",&oper);
if(oper == 0){
scanf("%d",&operNum);
stack1.push(operNum);
stack1Num ++;
if(operNum <= stackMin.top()){
stackMin.push(operNum);
stackMinNum ++;
}
}else if(oper == 1){
if(stack1Num>0){
printf("%d\n",stack1.top());
}else{
printf("ERROR!\n");
}
}else if(oper == 2){
if(stackMinNum>0){
printf("%d\n",stackMin.top());
}else{
printf("ERROR!\n");
}
}else if(oper == 3){
if(stack1Num>0){
int top = stack1.top();
stack1.pop();
stack1Num --;
if(top == stackMin.top()){
stackMin.pop();
stackMinNum --;
}
}else{
printf("ERROR!\n");
}
}
}
return 0;
}