数据结构之栈的面试题:最小栈的实现

本文介绍了一种在不破坏栈的入栈出栈顺序的前提下,始终保持栈顶为栈内元素最小值的最小栈实现方法。通过双元素入栈策略,确保了栈顶总是当前栈内的最小元素。此外,还提供了完整的最小栈实现代码与测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前面几个博客,利用顺序表去链表的方式分别实现了队列与栈的基本操作。这篇博客,我们对常见的一些栈、队列的面试题进行总结。


最小栈的实现

什么是最小栈,最小栈的意思就是在不破坏栈的入栈出栈顺序的前提下,在栈顶永远保存着栈内元素的最小值。我们的思路是每次在入栈元素时入栈两个,第一个入应该入的元素,第二个入栈内最小元素。

//实现
#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;
}

欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值