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); }
相关文章推荐
- 初次接触:DirectDraw 分类: VC++ DirectX 2013-11-09 11:16 950人阅读 评论(0) 收藏
- 高级DirectDraw 分类: VC++ DirectX 2013-11-09 11:14 654人阅读 评论(0) 收藏
- IDirectDraw接口 分类: VC++ 2013-11-09 11:13 705人阅读 评论(0) 收藏
- 二维数组和二维指针
- 学C++不得不看的一篇文章[转]
- C++ - "动态内存成员" 的 类设计 (值和指针)
- c语言中字符串比较易错的地方
- C++ - "动态内存成员" 的 类设计 (值和指针)
- 算法导论 - QuickSort 快速排序 C++实现
- C++ Virtual详解
- C++ Virtual详解
- VC++获取U盘盘符(各种类型的驱动器都可以)
- C++版基本算法4-哈希查找
- 使用Code Blocks编写C++程序遇到的一些问题
- BCB6.0中的__FUNC__(vc++6.0中没有此功能)
- 关于学习C++和编程的50个观点~~~转
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
- hdoj 1014 Uniform Generator
- 基于DirectShow的MPEG-4视频传输系统的研究与实现 分类: VC++ DirectX 2013-11-09 09:40 630人阅读 评论(0) 收藏
- 如何使用DirectDraw直接显示RGB、YUV视频数据(播放yuv) 分类: VC++ DirectX 2013-11-09 09:39 758人阅读 评论(0) 收藏