设计一个具有GetMin功能的栈

//先说一下需求吧: //用栈实现一个具有GetMin功能的算法,要求push,pop,getMin()操作的时间复杂度为O(1) //当然用java实现更方便,因为已经具有现成的栈结构 //我在这里把栈的结构,和原理实现一下

#include<stdio.h> #include<stdlib.h>

#define MAX_SIZE 10 //定义一个栈容量为10的符号常量 #define OK 1 #define ERROR 0 #define INIT -1

//用结构体定义一个栈的结构 typedef struct{  int data[MAX_SIZE];  int top;//定义一个变量,用来存放当前栈的大小,相当于栈的指针 }Stack,*Stack_Link;

//用到如下的功能函数 void Init(Stack_Link s);//初始化一个栈的结构

//bool push();注意这样写是不正确的,因为C语言中没有bool类型 void push(Stack_Link s,int data);//向栈结构压入一个数据 int pop(Stack_Link s);//弹栈操作 int is_empty(Stack s);//是否为空栈,如果是返回1,否则为0 int is_full(Stack s);//是否为满栈,如果是返回1,否则返回0

int get_min(Stack_Link s,Stack_Link des);//返回当前栈中最小的元素

void Init(Stack_Link s){  s->top = -1;//初始化一个栈,使其“指针指向为-1”这样可以省一个空间 }

void push(Stack_Link s,int data){  if(is_full(*s)){   printf("栈满,无法添加元素!\n");   return ;  }  s->data[++s->top] = data; }

int pop(Stack_Link s){  int data;  if(is_empty(*s)){ //  printf("栈空,无法操作!\n");   return ERROR;  }  data = s->data[s->top--];//注意这里--s->top区别,弹栈操作,先把当前指向的内容弹出,再指向下一个  return data; }

int peek(Stack s){  if(is_empty(s))  {  // printf("栈空!\n");   return ERROR;  }  return s.data[s.top]; }

int is_empty(Stack s){  if(s.top == -1){  // printf("栈空!@-@\n");   return OK;  }  else   return ERROR;  //也可以用三元运算符:(s->top == -1)? return OK; return ERROR; }

int is_full(Stack s){  if(s.top == MAX_SIZE-1){   printf("栈满!@-@\n");   return OK;  }  else   return ERROR; }

int get_min(Stack_Link s,Stack_Link d){  int data;  int times;  printf("请输入要添加元素的个数:\n");  scanf("%d",&times);  for(;times>0;times--)  {   printf("请输入元素的值:\n");   scanf("%d",&data);   if(is_empty(*s))   {    push(s,data);    push(d,data);   }   else   {    push(s,data);    if(data >= peek(*d))     push(d,peek(*d));    if(data < peek(*d))     push(d,data);   }  }

 printf("当前栈中,最小的元素为:%d\n",peek(*d));  times=0;  while(!is_empty(*s))  {   printf("第%d次弹栈操作:\n",++times);   if(peek(*s) == peek(*d))   {    printf("弹出的元素为%d\n",pop(s));    printf("当前栈中,最小的元素为:%d\n",pop(d));   }   else{    printf("弹出的元素为:%d\n",pop(s));    printf("当前栈中,最小的元素为:%d\n",peek(*d));   }  }  return OK; }

int main(){  Stack s,d;  Init(&s);  Init(&d);  get_min(&s,&d); }

 

### Python 中的实现与应用 #### 的概念 是一种线性的数据结构,其操作遵循“后进先出”(Last In First Out, LIFO)原则。这意味着最近被添加到中的元素会最先移除[^2]。 #### 使用列表模拟的操作 Python 的内置 `list` 类型可以很方便地用来表示。通过使用 `append()` 方法向顶添加元素,以及使用 `pop()` 方法从顶弹出元素,能够轻松完成的主要功能: ```python stack = [] # 向中压入元素 stack.append('a') stack.append('b') print(f"当前状态: {stack}") # 从中弹出顶部元素 top_element = stack.pop() print(f"弹出了元素 '{top_element}', 当前状态: {stack}") ``` 上述代码展示了如何利用 Python 列表作为简单的容器来执行基本的堆叠和卸载动作。 #### 设计高效的最小值 为了满足更复杂的场景需求,比如获取内的最小值而不需要遍历整个,在每次插入新元素时额外记录当时的最小值是一个有效的策略。这样可以在常数时间内获得内任意时刻下的最小值[^3]: ```python class MinStack: def __init__(self): self.stack = [] self.min_stack = [] def push(self, val: int) -> None: self.stack.append(val) if not self.min_stack or val <= self.getMin(): self.min_stack.append(val) def pop(self) -> None: if self.stack[-1] == self.getMin(): self.min_stack.pop() return self.stack.pop() def top(self) -> int: return self.stack[-1] def getMin(self) -> int: return self.min_stack[-1] min_stack = MinStack() min_stack.push(-2) min_stack.push(0) min_stack.push(-3) print(min_stack.getMin()) # 返回 -3. min_stack.pop() print(min_stack.top()) # 返回 0. print(min_stack.getMin()) # 返回 -2. ``` 这段代码定义了一个名为 `MinStack` 的类,实现了具有 O(1) 时间复杂度的 `push`, `pop`, 和查询最小值的功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在路上0616

随缘吧打赏与否还是会坚持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值