第一行输入一个整数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;
}