第一行输入一个整数N,表示对栈进行的操作总数。
下面N行每行输入一个字符串S,表示操作的种类。
如果S为"push",则后面还有一个整数X表示向栈里压入整数X。
如果S为"pop",则表示弹出栈顶操作。
如果S为"getMin",则表示询问当前栈中的最小元素是多少。
对于每个getMin操作,输出一行表示当前栈中的最小元素是多少。
6 push 3 push 2 push 1 getMin pop getMin
1 2
1<=N<=1000000
-1000000<=X<=1000000
数据保证没有不合法的操作
#include <stdio.h> #include <string.h> #include <malloc.h> #include <stdbool.h> typedef struct { int *data; int top; } stack; stack *new_stack(int cap) { stack *st = (stack *) malloc(sizeof(stack)); st->data = (int *) malloc(sizeof(int) * cap); st->top = -1; return st; } void push(stack *st, int val) { st->data[++st->top] = val; } int pop(stack *st) { return st->data[st->top--]; } int top(stack *st) { return st->data[st->top]; } bool is_empty(stack *st) { return st->top == -1; } void destroy_stack(stack *st) { free(st->data); free(st); } int main(void) { int n, x; char opt[10]; scanf("%d", &n); stack *nums = new_stack(n); stack *mins = new_stack(n); for (int i = 0; i < n; i++) { scanf("%s", opt); if (strcmp(opt, "push") == 0) { scanf("%d", &x); push(nums, x); if (is_empty(mins) || x <= top(mins)) { push(mins, x); } } else if (strcmp(opt, "pop") == 0) { x = pop(nums); if (x == top(mins)) { pop(mins); } } else { printf("%d\n", top(mins)); } } destroy_stack(nums); destroy_stack(mins); return 0; }