C Datastructure 5 ---- stack
来源:互联网 发布:淘宝买东西受骗怎么办 编辑:程序博客网 时间:2024/06/04 19:38
栈(stack)也是最基本的额数据结构之一,其实也就是特殊化的表,也就是插入和弹出元素都是在栈顶(相当于线性表的表尾)。
自从我们了解了链表这个东东以后,最大的好处就是在也不用提前用数组分配内存了,随用随取(malloc),不用就释放(free)。
所以,栈的实现也可以分为两种,不过还有一种比较少见的双栈(double stack),就是两个栈使用同一块内存区域,两个stack的
top在这个内存区域的两端,后面有详细的数据结构,看下便知。
- stack(预先分配内存,使用数组)
- link stack(使用链表思想实现)
- double stack
stack github参考源码
首先是使用数组实现的普通stack
typedef int ElementType;typedef struct{ ElementType data[MAX_SIZE]; int top; }stStack;void InitStack(stStack* stack);BOOL IsFullStack(stStack* stack);BOOL IsEmptyStack(stStack* stack);BOOL Push(stStack* stack, ElementType elem);BOOL Pop(stStack* stack, ElementType *elem);int GetLength(stStack* stack);
比较简单,不贴具体实现了,需要详细了解的点击上面链接下载github源码。
下一个是link stack 的实现。
数据结构和接口。
typedef int ElementType;typedef struct stStackNode{ ElementType data; struct stStackNode* next;}stStackNode;typedef struct{ stStackNode* top; int length;}stLinkStack;void InitStack(stLinkStack* stack);BOOL IsFullStack(stLinkStack* stack);BOOL IsEmptyStack(stLinkStack* stack);BOOL Push(stLinkStack* stack, ElementType elem);BOOL Pop(stLinkStack* stack, ElementType *elem);int GetLength(stLinkStack* stack);void ClearStack(stLinkStack* stack);
看下push 和 pop
BOOL Push(stLinkStack* stack, ElementType elem){ stStackNode* node = (stStackNode*)malloc(sizeof(stStackNode)); node->next = stack->top; node->data = elem; stack->top = node; stack->length++; return TRUE;}BOOL Pop(stLinkStack* stack, ElementType *elem){ stStackNode* delNode; if(IsEmptyStack(stack)) return FALSE; delNode = stack->top; *elem = delNode->data; stack->top = delNode->next; free(delNode); stack->length--; return TRUE;}
最后一个是双栈(double stack),比较简单。
数据结构和接口。
typedef int ElementType;typedef struct{ ElementType data[MAX_SIZE]; int top1; int top2; }stDoubleStack;void InitStack(stDoubleStack* stack);BOOL IsFullStack(stDoubleStack* stack);BOOL IsEmptyStack(stDoubleStack* stack);BOOL Push(stDoubleStack* stack,int stack_num, ElementType elem);BOOL Pop(stDoubleStack* stack, int stack_num, ElementType *elem);int GetLength(stDoubleStack* stack);
下面是具体实现
void InitStack(stDoubleStack* stack){ stack->top1 = -1; stack->top2 = 1024;}BOOL IsFullStack(stDoubleStack* stack){ return (stack->top1+1 == stack->top2);}BOOL IsEmptyStack(stDoubleStack* stack){ return (stack->top1==-1 && stack->top2==1024);}BOOL Push(stDoubleStack* stack,int stack_num, ElementType elem){ if(IsFullStack(stack)) return FALSE; if(stack_num==1) { stack->data[++stack->top1] = elem; return TRUE; } else if(stack_num==2) { stack->data[--stack->top2] = elem; return TRUE; } else return FALSE;}BOOL Pop(stDoubleStack* stack, int stack_num, ElementType *elem){ if(stack_num==1) { if(stack->top1==-1) return FALSE; *elem = stack->data[stack->top1--]; return TRUE; } else if(stack_num==2) { if(stack->top2==1024) return FALSE; *elem = stack->data[stack->top2++]; return TRUE; } else return FALSE;}int GetLength(stDoubleStack* stack){ return stack->top1+1 + 1024-stack->top2;}
0 0
- C Datastructure 5 ---- stack
- 【DataStructure】The description and usage of Stack
- DataStructure-5-字符串
- C Datastructure 1 ---- linear list
- DataStructure----LinerList,线性表C实现
- DataStructure---LinkList 链表C语言实现代码
- C Datastructure 2 ---- link list(1)
- C Datastructure 3 ---- link list(2)
- C Datastructure 4 ---- link list(3)
- c++:stack
- useful datastructure:
- All DataStructure
- Game - datastructure
- 【datastructure】栈。
- Python4:DataStructure
- LeetCode-DataStructure
- Stack-c++template
- c++:什么是stack frame?
- PDFrenderer
- SO_REUSEADDR套接字选项
- 有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N)
- Android on the transplant ghostscript-9.04 static compiler
- 单例模式实现:枚举单例
- C Datastructure 5 ---- stack
- 剑指offer 求1+2+3+...+n
- Codeforces 789E The Great Mixing (数推倒公式 + bfs + 剪枝)
- fortify——J2EE Bad Practices: Non-Serializable Object Stored in Session
- 在Android Studio中进行单元测试和UI测试
- $.parser.setParserOptions()的实现
- 深度增强学习:走向通用人工智能之路
- 1、uboot的目录分析
- 从GitHub上下载单个文件