Skip to content

Commit eca5403

Browse files
committed
"Min Stack"
1 parent 7519b53 commit eca5403

File tree

2 files changed

+114
-1
lines changed

2 files changed

+114
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ them with C++ Language.
3939
| 158 | [Read N Characters Given Read4 II - Call multiple times] | |
4040
| 157 | [Read N Characters Given Read4] | |
4141
| 156 | [Binary Tree Upside Down] | |
42-
| 155 | [Min Stack] | |
42+
| 155 | [Min Stack] | [C](src/155.c) |
4343
| 154 | [Find Minimum in Rotated Sorted Array II] | |
4444
| 153 | [Find Minimum in Rotated Sorted Array] | |
4545
| 152 | [Maximum Product Subarray] | [C](src/152.c) |

src/155.c

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
4+
typedef struct StackNode {
5+
int val;
6+
struct StackNode *next;
7+
} StackNode;
8+
9+
typedef struct MinStack {
10+
int size;
11+
StackNode *top;
12+
StackNode *min;
13+
} MinStack;
14+
15+
void minStackCreate(MinStack *stack, int maxSize) {
16+
/* I implement a linked stack, so I don't need maxSize */
17+
if (stack) {
18+
stack->min = NULL;
19+
stack->top = NULL;
20+
stack->size = 0;
21+
}
22+
}
23+
24+
void minStackPush(MinStack *stack, int element) {
25+
if (stack) {
26+
StackNode *new_node = (StackNode *)calloc(1, sizeof(StackNode));
27+
new_node->val = element;
28+
new_node->next = stack->top;
29+
stack->top = new_node;
30+
stack->size++;
31+
/* update min pointer */
32+
StackNode *new_min = (StackNode *)calloc(1, sizeof(StackNode));
33+
new_min->val = element;
34+
new_min->next = stack->min;
35+
36+
if (stack->min) {
37+
if (stack->min->val >= element){
38+
stack->min = new_min;
39+
}
40+
}
41+
else {
42+
stack->min = new_min;
43+
}
44+
}
45+
}
46+
47+
void minStackPop(MinStack *stack) {
48+
if (stack && stack->top) {
49+
StackNode *t = stack->top;
50+
stack->top = stack->top->next;
51+
if (stack->min && t <= stack->min) {
52+
StackNode *m = stack->min;
53+
stack->min = stack->min->next;
54+
free(m);
55+
}
56+
stack->size--;
57+
free(t);
58+
}
59+
}
60+
61+
int minStackTop(MinStack *stack) {
62+
if (stack && stack->top) {
63+
return stack->top->val;
64+
}
65+
return 0;
66+
}
67+
68+
int minStackGetMin(MinStack *stack) {
69+
if (stack && stack->min) {
70+
return stack->min->val;
71+
}
72+
return 0;
73+
}
74+
75+
void minStackDestroy(MinStack *stack) {
76+
if (stack) {
77+
while (stack->size != 0) {
78+
minStackPop(stack);
79+
}
80+
while (stack->min != NULL) {
81+
StackNode *m = stack->min;
82+
stack->min = stack->min->next;
83+
free(m);
84+
}
85+
/**
86+
*free(stack);
87+
*stack = NULL;
88+
*/
89+
}
90+
}
91+
92+
int main() {
93+
MinStack stack;
94+
minStackCreate(&stack, 10);
95+
int i;
96+
for (i = 0; i < 5; i++) {
97+
minStackPush(&stack, i);
98+
}
99+
100+
printf("top: %d\n", minStackTop(&stack));
101+
printf("min: %d\n", minStackGetMin(&stack));
102+
103+
for (i = 1; i < 5; i++) {
104+
minStackPush(&stack, -i);
105+
}
106+
107+
printf("top: %d\n", minStackTop(&stack));
108+
printf("min: %d\n", minStackGetMin(&stack));
109+
110+
minStackDestroy(&stack);
111+
112+
return 0;
113+
}

0 commit comments

Comments
 (0)