题目1522:包含min函数的栈
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:2320
解决:753
-
题目描述:
-
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的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
-
-
自己写完后,然后阅览了网上的博客,发现大多用了两个栈来解决该问题。 入栈出栈遍历最小值都在一个栈。输入用cin<<,避免不必要的麻烦
-
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <iostream> using namespace std; #define _addsize_ 100 typedef struct node { int *first, *end; int size; } node,*stack; void init(node *s) { s->first = s->end = (int *)malloc(sizeof(int)*_addsize_); s->size = _addsize_; } void stackpush(node *s, int num) { if (s->end - s->first == s->size) { s->first = (int*)realloc(s->first, sizeof(int)*(s->size+_addsize_)); s->end = s->first + s->size; s->size = s->size + _addsize_; } *(s->end) = num; (s->end)++; } void stackmin(node *s1) { if (s1->end - s1->first == 0) { printf("NULL\n"); return; } int *p = s1->first; int min = *(s1->first); for (; p != s1->end; p++) { if (*p < min) min = *p; } printf("%d\n", min); return; } void stackpop(node *s1) { (s1->end)--; } int main() { node s1; init(&s1); int n, num; char ch; while (scanf("%d", &n) != EOF) { getchar(); while (n--) { cin >> ch; if (ch == 's') { cin >> num; stackpush(&s1, num); stackmin(&s1); } else if (ch == 'o') { stackpop(&s1); stackmin(&s1); } } } return 0; }