您的位置:首页 > 其它

设计一个具有GetMin功能的栈

2017-04-07 17:44 609 查看
//先说一下需求吧:
//用栈实现一个具有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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息