设计一个具有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); }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

想做个自由的人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值