您的位置:首页 > 编程语言 > C语言/C++

C语言数组实现栈的基本操作,并利用O(1)求出栈中最小元素

2013-11-09 11:19 931 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#define MAX_STACK_SIZE 80

typedef struct
{
	unsigned int stack[MAX_STACK_SIZE];
	int top; //top 默认值是-1,所以应该是int型
	unsigned int down_min[MAX_STACK_SIZE]; //储存栈中各个元素到栈底元素中的最小值,eg 栈[5,2,3,4,8,1] 5为栈底,则down_min为[5,2,2,2,2,1]
}sequence_stack;
/*初始化栈*/
sequence_stack* initialize_seqstack() 
{
	sequence_stack* seqstack = NULL;
	seqstack = (sequence_stack*)malloc(sizeof(sequence_stack));
	memset(seqstack,0,sizeof(sequence_stack));
	seqstack->top = -1;
	return seqstack;
}
/*销毁栈*/
void destroy_seqstack(sequence_stack* seqstack)
{
	if(seqstack != NULL)
	{
		free(seqstack);
	}
	return;
}
/*入栈*/
unsigned int push_seqstack(sequence_stack *seqstack, unsigned int value)
{
	if(seqstack != NULL)
	{
		if(seqstack->top == MAX_STACK_SIZE-1)
		{
			printf("stack is full\n");
			return -1;
		}
		else
		{	seqstack->stack[++seqstack->top] = value;
			if(seqstack->top == 0)
			{
				seqstack->down_min[seqstack->top] = value;
			}
			else
			{	if(value < seqstack->down_min[seqstack->top-1])
				{
					seqstack->down_min[seqstack->top] = value;
				}
				else
				{
					seqstack->down_min[seqstack->top] = seqstack->down_min[seqstack->top-1];
				}
			}
			return 0;
		}
	}
	return -1;
}
/*出栈*/
unsigned int pop_seqstack(sequence_stack *seqstack)
{
	if(seqstack != NULL)
	{
		if(seqstack->top == -1)
		{
			printf("stack is empty\n");
			return -1;
		}
		else
		{
			return seqstack->stack[seqstack->top--];
		}
	}
}
/*打印栈元素*/
void print_seqstack(sequence_stack *seqstack)
{
	if(seqstack != NULL)
	{
		int i = 0; 
		printf("stack from end to top :\n");
		for(i=0;i<=(seqstack->top);i++)
		{
			printf("%d,",seqstack->stack[i]);
		}
		printf("\n");
	}
}
/*打印最小数组元素*/
void print_seqstack_min_array(sequence_stack *seqstack)
{
	if(seqstack != NULL)
	{
		int i = 0;
		printf("down_min from end to top :\n");
		for(i=0;i<=(seqstack->top);i++)
		{
			printf("%d,",seqstack->down_min[i]);
		}
		printf("\n");
	}
}
/*打印当前栈的最小值*/
void printf_minvalue(sequence_stack *seqstack)
{
	if(seqstack != NULL)
	{
		printf("min value is %d\n",seqstack->down_min[seqstack->top]);
	}
	return ;
}
void main()
{    
	sequence_stack *seqstack = initialize_seqstack();
	push_seqstack(seqstack,5);
	push_seqstack(seqstack,13);
	push_seqstack(seqstack,6);
	pop_seqstack(seqstack);
	pop_seqstack(seqstack);
	pop_seqstack(seqstack);
	push_seqstack(seqstack,2);
	push_seqstack(seqstack,33);
	push_seqstack(seqstack,7);
	print_seqstack(seqstack);
	print_seqstack_min_array(seqstack);
        destroy_seqstack(seqstack);
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: