包含min函数的栈
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:999
解决:323
-
题目描述:
-
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的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
解题思路:用一个栈保存输入元素的最小值,当栈为空时,输入的元素即为最小值,当栈不为空时,输入元素与栈最小值进行比较,较小的值放入栈中,当弹出栈时分为两种情况,一种是有元素,弹出栈顶元素后又分为两种情况,有元素即栈顶元素为元素序列的最小值,如无元素输出NULL,标记栈为空,一种是无元素,输出NULL,标记栈为空。
C++代码:
#include<iostream> #include<stdio.h> #include<vector> #include<string> using namespace std; vector<int> vec; int max(int n1,int n2) { if(n1<n2) return n1; else return n2; } int main() { int n; while(scanf("%d",&n)!=EOF){ int min; bool isfirst = true; vec.clear(); for(int i=0;i<n;i++){ string s; cin>>s; if(s == "s"){ int val; cin>>val; if(isfirst){ min=val; isfirst = false; } else{ min = max(min,val); } printf("%d\n",min); vec.push_back(min); }else{ if(!vec.empty()){ vec.pop_back(); if(!vec.empty()){ min = vec.back(); printf("%d\n",min); }else{ isfirst = true; printf("NULL\n"); } } else printf("NULL\n");//这里没有标记栈为空,是因为它本身是在栈空的情况下无法弹出栈顶元素。 } } } return 0; }
C 代码:<pre name="code" class="cpp">#include<stdio.h> int stack[1000000]; int getmin(int n1, int n2){ if(n1<n2) return n1; else return n2; } int main() { int n; char s; int top; while(scanf("%d",&n)!=EOF){ top = -1; int min; int isfirst = 1; int val; while(getchar()!='\n'); for(int i = 0;i<n ;i++){ scanf("%c",&s); if(s == 's'){ scanf("%d",&val); if(isfirst == 1){ min = val; isfirst = 0; }else{ min = getmin(min,val); } stack[++top]=min; printf("%d\n",min); }else{ if(top == -1) printf("NULL\n"); else{ top--; if(top == -1){ isfirst = 1; printf("NULL\n"); }else{ min = stack[top]; printf("%d\n",min); } } } while(getchar()!='\n'); } } return 0; }
</pre><pre code_snippet_id="413203" snippet_file_name="blog_20140701_4_9004358" name="code" class="cpp">题目关键:栈保存的不是输入元素,而是元素的最小值。