閱讀265 返回首頁    go 阿裏雲 go 技術社區[雲棲]


劍指Offer之包含min函數的棧

題目描述:

定義棧的數據結構,請在該類型中實現一個能夠得到棧最小元素的min函數。

輸入:

輸入可能包含多個測試樣例,輸入以EOF結束。
對於每個測試案例,輸入的第一行為一個整數n(1<=n<=1000000), n代表將要輸入的操作的步驟數。
接下來有n行,每行開始有一個字母Ci。
Ci=’s’時,接下有一個數字k,代表將k壓入棧。
Ci=’o’時,彈出棧頂元素。

輸出:

對應每個測試案例中的每個操作,
若棧不為空,輸出相應的棧中最小元素。否則,輸出NULL。

樣例輸入:
7
s 3
s 4
s 2
s 1
o
o
s 0
樣例輸出:
3
3
2
1
2
3
0



/*********************************
*   日期:2013-11-19
*   作者:SJF0115
*   題號: 題目1522:包含min函數的棧
*   來源:https://ac.jobdu.com/problem.php?pid=1522
*   結果:AC
*   來源:劍指Offer
*   總結:
**********************************/
#include<iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;

int MinOfStack(int n){
    int i,num;
    char operate;
    stack<int> numStack;
    stack<int> minStack;

    for(i = 0;i < n;i++){
        scanf(" %c",&operate);
        //進棧
	    if(operate == 's'){
            scanf("%d",&num);
            numStack.push(num);
            //輔助棧不空
            if(!minStack.empty()){
                int minNum = minStack.top();
                //當前值和最小值比較,小的放入minStack
                if(num < minNum){
                    minStack.push(num);
                }
                else{
                    minStack.push(minNum);
                }
            }
            //輔助棧空
            else{
                minStack.push(num);
            }
            printf("%d\n",minStack.top());
        }
        //出棧
        else if(operate == 'o'){
            if(!minStack.empty()){
                minStack.pop();
                numStack.pop();
            }
            if(!minStack.empty()){
                printf("%d\n",minStack.top());
            }
            else{
                printf("NULL\n");
            }
        }
        //非法
        else{
            return 0;
        }
    }
    return 1;
}

int main()
{
	int i,n;
	while(scanf("%d",&n) != EOF){
        int result = MinOfStack(n);
        if(result == 0){
            break;
        }
	}
	return 0;
}



#include <stdio.h>
 
#define MAXN 1000010
 
int stackA[MAXN],stackB[MAXN];
int top=-1,min;
 
void push(int num)
{
    if(top==-1){
        min=num;
        stackA[++top]=num;
    }
    else{
        if(min>=num){
            stackA[++top]=num;
            stackB[top]=min;
            min=num;
        }
        else
            stackA[++top]=num;
    }
    printf("%d\n",min);
}
 
void pop()
{
    int tmp=stackA[top--];
    if(top==-1){
        printf("NULL\n");
        return ;
    }
    if(tmp==min)
        min=stackB[top+1];
    printf("%d\n",min);
    return ;
}
 
int main()
{
    int n,num;
    char c;
    while(scanf("%d",&n)!=EOF){
        top=-1;
        while(n--){
            scanf(" %c",&c);
            if(c=='s'){
                scanf("%d",&num);
                push(num);
            }
            else if(c=='o')
                pop();
        }
    }
    return 0;
}



最後更新:2017-04-03 14:54:25

  上一篇:go Java運用JFrame實現右鍵菜單改變背景顏色
  下一篇:go 個人記錄