DUTOJ-1013: 小q与面试题

话说前几天小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;
}

猜你喜欢

转载自blog.csdn.net/l1558198727/article/details/80238523