在前面几个博客,利用顺序表去链表的方式分别实现了队列与栈的基本操作。这篇博客,我们对常见的一些栈、队列的面试题进行总结。
最小栈的实现
什么是最小栈,最小栈的意思就是在不破坏栈的入栈出栈顺序的前提下,在栈顶永远保存着栈内元素的最小值。我们的思路是每次在入栈元素时入栈两个,第一个入应该入的元素,第二个入栈内最小元素。
//实现
#include <stdio.h>
#include "seqstack.h"
typedef struct Min_SeqStack {
SeqStack stack;
}Min_SeqStack;
void Min_SeqStackPrint(Min_SeqStack* s)
{
if(s == NULL) {
return;
}
size_t i = 0;
for(; i < s->stack.size; i++) {
printf("%c ", s->stack.data[i]);
}
printf("\n");
}
void Min_SeqStackInit(Min_SeqStack* s)
{
if(s == NULL) {
return;
}
SeqStackInit(&s->stack);
return;
}
void Min_SeqStackPush(Min_SeqStack* s, SeqStackType value)
{
if(s == NULL) {
return;
}
SeqStackType top;
SeqStackType min;
if(s->stack.size == 0) {
SeqStackPush(&s->stack, value);
SeqStackPush(&s->stack, value);
} else {
SeqStackGetFront(&s->stack, &top);
min = top < value ? top : value;
SeqStackPush(&s->stack, value);
SeqStackPush(&s->stack, min);
}
return;
}
void Min_SeqStackPop(Min_SeqStack* s)
{
if(s == NULL) {
return;
}
if(s->stack.size == 0) {
return;
}
SeqStackPop(&s->stack);
SeqStackPop(&s->stack);
}
int Min_SeqStackTop(Min_SeqStack* s, SeqStackType* value)
{
if(s == NULL) {
return -1;
}
if(s->stack.size == 0) {
return -1;
}
return SeqStackGetFront(&s->stack, value);
}
这里我们借用了之前的顺序栈的一些函数来帮助我们实现。
测试代码如下:
int main()
{
Min_SeqStack s;
Min_SeqStackInit(&s);
Min_SeqStackPush(&s, 'a');
Min_SeqStackPush(&s, 'c');
Min_SeqStackPush(&s, 'd');
Min_SeqStackPush(&s, 's');
Min_SeqStackPrint(&s);
SeqStackType value;
Min_SeqStackTop(&s, &value);
Min_SeqStackPrint(&s);
printf("%c\n", value);
Min_SeqStackPop(&s);
Min_SeqStackPrint(&s);
Min_SeqStackTop(&s, &value);
printf("%c\n", value);
Min_SeqStackPop(&s);
Min_SeqStackPrint(&s);
Min_SeqStackTop(&s, &value);
printf("%c\n", value);
Min_SeqStackPop(&s);
Min_SeqStackPrint(&s);
Min_SeqStackTop(&s, &value);
printf("%c\n", value);
return 0;
}
欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!