//先说一下需求吧: //用栈实现一个具有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",×); 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); }
设计一个具有GetMin功能的栈
最新推荐文章于 2021-01-14 18:09:26 发布