剑指Offer题目1522:包含min函数的栈

来源:互联网 发布:对java面向对象的理解 编辑:程序博客网 时间:2024/05/23 11:07
题目1522:包含min函数的栈

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:2320

解决:753

题目描述:

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

输入:

输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数。
接下来有n行,每行开始有一个字母Ci。
Ci=’s’时,接下有一个数字k,代表将k压入栈。
Ci=’o’时,弹出栈顶元素。

输出:

对应每个测试案例中的每个操作,
若栈不为空,输出相应的栈中最小元素。否则,输出NULL。

样例输入:
7s 3s 4s 2s 1oos 0
样例输出:
332123

0


自己写完后,然后阅览了网上的博客,发现大多用了两个栈来解决该问题。 入栈出栈遍历最小值都在一个栈。输入用cin<<,避免不必要的麻烦

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <iostream>using namespace std;#define _addsize_ 100typedef 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;}


原创粉丝点击