《数据结构与算法分析》—栈的链表和数组实现(C语言)
2016-03-11 09:54
399 查看
/* *栈的链表实现 *表头作为栈顶 */ #include <stdio.h> #include <stdlib.h> struct Node { ElementType Element; PtrToNode Next; }; int IsEmpty(Stack S) { return S->Next==NULL; } void Push(ElementType X,Stack S)//插入在表头 { Stack p; p=(struct Node*)malloc(sizeof(struct Node)); p->Element=X; p->Next=S->Next; S->Next=p; } ElementType Top(Stack S)//表头为栈顶 { if(!IsEmpty(S)) return S->Next->Element; return 0; } void Pop(Stack S) { PtrToNode p=S->Next; if(IsEmpty(S)) printf("Empty stack"); else { S->Next=p->Next; free(p); } } void MakeEmpty(Stack S) { if(S==NULL) printf("Must use CreateStack first"); else while(!IsEmpty(S)) Pop(S); } void StackPrint(Stack S) { struct Node *P=S->Next; while(P!=NULL) { printf("%3d",P->Element); P=P->Next; } } int main() { Stack S; S=(struct Node*)malloc(sizeof(struct Node)); S->Next=NULL; int i=0; for(i=0;i<5;++i) { Push(i,S); } StackPrint(S); printf("\nTop=%3d\n",Top(S));//表头为栈顶 Pop(S); StackPrint(S); return 0; } /* *栈的数组实现 * */ #include <stdio.h> #include <stdlib.h> struct StackArr { int Capacity;//容量 int TopOfStack;//数组下标 ElementType *Array; }; int IsEmpty(Stack S)//检查一个栈是否为空栈 { return S->TopOfStack==EmptyTOS; } int IsFull(Stack S) { return S->TopOfStack==S->Capacity-1; } void MakeEmpty(Stack S)//创建一个空栈 { S->TopOfStack=EmptyTOS; } void Push(ElementType X,Stack S) { if(IsFull(S)) printf("Full stack"); else S->Array[++S->TopOfStack]=X; } ElementType Top(Stack S) { if(!IsEmpty(S)) return S->Array[S->TopOfStack]; printf("Empty stack"); return 0; } void Pop(Stack S) { if(IsEmpty(S)) printf("Empty stack"); else S->TopOfStack--; } ElementType TopAndPop(Stack S) { if(!IsEmpty(S)) return S->Array[S->TopOfStack--]; printf("Empty stack"); return 0; } Stack CreateStack(int MaxElements) { Stack S; if(MaxElements<MinStackSize) printf("Stack size if too small"); S=malloc(sizeof(struct StackArr)); if(S==NULL) printf("Out of space!!!"); S->Array=malloc(sizeof(ElementType)*MaxElements); if(S->Array==NULL) printf("Out of space!!!"); S->Capacity=MaxElements; MakeEmpty(S); return S; } void StackArrPrint(Stack S) { int i; for(i=0;i<S->TopOfStack+1;++i) { printf("%3d\n",S->Array[i]); } } int main() { Stack S=CreateStack(7); printf("%d\n",S->Capacity); printf("%d\n",S->TopOfStack); int i=0; for(i=0;i<S->Capacity;++i) { Push(i,S); } StackArrPrint(S); return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总