- 题目描述:
-
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的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函数的栈 * 来源:http://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; }