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