栈(顺序栈,多栈共享技术,动态顺序栈,链栈)
2016-10-04 15:28
288 查看
1.顺序栈
#include<stdio.h> #include<stdlib.h> #define StackSize 10 //创建 typedef struct SeqStack { int elem[StackSize]; int top;//存放栈顶元素的下标 -1表示空栈 }SeqStack; //初始化 void InitStack(SeqStack *S) { S->top = -1; } //入栈 int Push(SeqStack *S, int elem) { if (S->top == StackSize - 1) { return 0; } S->top++; S->elem[S->top] = elem; return 1; } //出栈 int Pop(SeqStack *S, int *elem) { if (S->top == -1) { return 0; } *elem = S->elem[S->top]; S->top--; return 1; } int main() { SeqStack S; InitStack(&S); int i = 0; int ret = 0; int PopElem = 0; printf("入栈<:"); for (i = 0; i < 10; i++) { ret = Push(&S, i + 1); if (ret == 0) { printf("\n栈满!"); break; } printf("%d ", S.elem[i]); } printf("\n前4个元素出栈<:"); for (i = 0; i < 4; i++) { ret=Pop(&S, &PopElem); if (ret == 0) { printf("\n栈空!"); break; } printf("%d ", PopElem); } printf("\n"); system("pause"); return 0; }
2. 双端顺序栈
#include<stdio.h> #include<stdlib.h> #define M 20 //创建 typedef struct DqStack { int elem[M]; int top[2];//栈顶指示器,分别存放两个栈顶的下标 }DqStack; //初始化 void InitStack(DqStack *D) { D->top[0] = -1; D->top[1] = M; } //第i号栈入栈 int Push(DqStack *D, int elem, int i) { if (D->top[0] + 1 == D->top[1])//栈满 return 0; switch (i) { case 0:{ D->top[0]++; D->elem[D->top[0]] = elem; break; } case 1:{ D->top[1]--; D->elem[D->top[1]] = elem; break; } default: break; } return 1; } //第i号栈出栈 int Pop(DqStack *D, int *elem, int i) { switch (i) { case 0:{ if (D->top[0] == -1) return 0; *elem = D->elem[D->top[0]]; D->top[0]--; break; } case 1:{ if (D->top[1] == M) return 0; *elem = D->elem[D->top[1]]; D->top[1]++; break; } default: break; } return 1; } int main() { DqStack D; InitStack(&D); int i = 0; int ret = 0; int n = M; int elem = 0; printf("第0号栈入栈<:"); for (i = 0; i < 10; i++) { ret = Push(&D, i + 1,0);//0号栈入栈 if (ret == 0) { printf("\n栈满!"); break; } printf("%d ", D.elem[i]); } printf("\n第1号栈入栈<:"); for (i = 0; i < 5; i++) { ret = Push(&D,i+2,1); if (ret == 0) { printf("\n栈满!"); break; } printf("%d ", D.elem[--n]); } printf("\n第0号栈前五个元素出栈<:"); for (i = 0; i < 5; i++) { ret = Pop(&D, &elem,0); if (ret == 0) { printf("\n栈空!"); break; } printf("%d ", elem); } printf("\n第1号前三个元素栈出栈<:"); for (i = 0; i < 3; i++) { ret = Pop(&D, &elem, 1); if (ret == 0) { printf("\n栈空!"); break; } printf("%d ", elem); } printf("\n"); system("pause"); return 0; }
3.动态顺序栈(将二进制数转换为十进制数)
#include<stdio.h> #include<stdlib.h> #include<math.h> #define StackSize 20 typedef char ElemType; //创建 typedef struct Stack { ElemType *base;//指向栈底 ElemType *top;//指向栈顶 int stacksize; }SqStack; //检查指针 void CheckPtr(void *ptr) { if (ptr == NULL) exit(EXIT_FAILURE); } //初始化 void InitStack(SqStack *S) { S->base = (ElemType *)malloc(StackSize*sizeof(ElemType)); CheckPtr(S->base); S->top = S->base; S->stacksize = StackSize; } //入栈 void Push(SqStack *S, int elem) { ElemType *tmp; if (S->top - S->base == S->stacksize) //栈满,追加 { tmp = (ElemType *)realloc(S->base, (S->stacksize + StackSize)*sizeof(ElemType)); CheckPtr(tmp); S->base = tmp; S->top = S->base + S->stacksize; S->stacksize += StackSize; } *(S->top) = elem; S->top++; } //出栈 void Pop(SqStack *S,ElemType *elem) { --S->top; *elem = *(S->top); } //销毁栈 void DesStack(SqStack *S) { free(S->base); S->base = S->top = NULL; S->stacksize = 0; } int main() { ElemType c; ElemType elem; SqStack S; InitStack(&S); int len = 0; int i = 0; int d = 0; printf("请输入二进制数<:"); scanf("%c", &c); while (c!='#') { Push(&S,c); //二进制数入栈 scanf("%c", &c); } len = S.top-S.base;//栈当前的长度 for (i = 0; i < len; i++) { Pop(&S, &elem); d += (elem-48)*pow(2, i); } printf("d=%d", d); DesStack(&S);//销毁栈 printf("\n"); system("pause"); return 0; }
4.链栈
#include<stdio.h> #include<stdlib.h> typedef int StackElem; //定义 typedef struct node { StackElem data; struct node *next; }LinkStackNode,*LinkStack; //初始化 void InitStack(LinkStack *S) { *S = (LinkStack)malloc(sizeof(LinkStackNode)); if (*S == NULL) { exit(EXIT_FAILURE); } (*S)->next = NULL; } //入栈 void Push(LinkStack *S, StackElem elem) { LinkStack new; LinkStack t = *S;//t指向头结点,即栈顶 new = (LinkStack)malloc(sizeof(LinkStackNode)); if (new == NULL) { exit(EXIT_FAILURE); } new->data = elem; new->next = t->next; t->next = new; } //出栈 int Pop(LinkStack *S, StackElem *elem) { LinkStack tmp; tmp = (*S)->next; if (tmp == NULL) return 0; (*S)->next = tmp->next; *elem = tmp->data; free(tmp); return 1; } int main() { LinkStack S; LinkStack tmp; int i = 0; StackElem elem; InitStack(&S);//初始化,建立带头结点的空链栈,并且该头结点作为栈顶指针 printf("入栈<:"); for (i = 0; i < 10; i++) { Push(&S, i+1);//入栈 printf("%d ", i + 1); } printf("\n出栈<:"); while (1) { if (Pop(&S, &elem) != 0) { printf("%d ", elem); } else break; } printf("\n"); system("pause"); return 0; }
相关文章推荐
- 顺序栈,两栈共享空间,链栈
- 顺序栈,共享栈以及链栈的相关操作
- 邀您共享顶级技术盛宴 ---2007软件开发2.0大会
- 利用微软WebService技术实现远程数据库存取 利用web服务在不同站点间共享同一数据库
- IBM WebSphere 开发者技术期刊: 使用 WebSphere Business Modeler 和 CVS 在团队环境中共享业务流程
- Aspose.Cell 产品介绍,技术共享交流群。
- 顺序栈、链栈基本操作
- NetAdvantage For .NET 产品介绍 电驴下载 技术共享群
- Linux中共享内存及内存映射技术研究
- 标准C++类std::string的内存共享和Copy-On-Write技术
- 双头(多头)显示技术,多点触摸技术和双核,三核,四核(多核)CPU结合将极大促进多人共享一台电脑的应用
- Spring+Hibernate+Struts技术的一个分页程序,共享给大家
- Win 2003共享“还原”技术
- Linux的内存管理,硬盘数据恢复的相关知识,SQL恢复技术,如何让多个系统共享资源
- Linux的共享内存技术
- 10大最佳技术应用网站(除年度最佳外,其余按首字拼音顺序排列)
- ITU-T T.120多媒体数据会议系统 DSS系列数据共享服务器 技术手册
- 数据库的复制技术在企业数据共享的深层应用
- 网络技术(1)Re: 哪个网关类共享上网软件可以限制客户机的带宽?
- Win 2003共享“还原”技术--卷影复制