数据结构学习(九)——链栈的操作
2012-11-27 14:55
501 查看
堆栈也可以采用链式存储结构,称为链栈。链栈常采用单链表表示。其实现是将链表的表头作为栈顶实现,这样就不需要在单链表中增加头结点,栈顶指针就是链表的头指针。
下面的代码实现了链栈的相关操作,其中有个错误关于重复申请堆空间让我郁闷了会儿,不过后来找出来了。
下面的代码实现了链栈的相关操作,其中有个错误关于重复申请堆空间让我郁闷了会儿,不过后来找出来了。
#include <stdio.h> #include <stdlib.h> typedef struct node { char data; struct node *next; }linkstack; linkstack * Linkstack_Create(); //创建链栈 char Linkstack_GetTop(linkstack *q); //取得栈顶 linkstack *Linkstack_In(linkstack *q, char dat); //入栈 linkstack * Linkstack_Out(linkstack *q, char *dat); //出栈 void Linkstack_SetNull(linkstack *q); //置空栈 int Linkstack_Empty(linkstack *q); //栈是否为空 void ShowLinkstack(linkstack *q); //输出显示栈 int main(void) { linkstack *q; int choice, ans; char dat; printf("链栈的操作练习:\n"); printf("请依次输入链栈字符数据('#'号表示结束):\n"); q = Linkstack_Create(); getchar(); while(1) { printf("链栈操作:\n"); printf("1.取得栈顶结点\n"); printf("2.入栈\n"); printf("3.出栈\n"); printf("4.输出显示链栈\n"); printf("5.退出程序\n"); printf("做出选择:"); scanf("%d", &choice); getchar(); //消除回车为后面带来的影响 switch(choice) { case 1: dat = Linkstack_GetTop(q); if(dat == '\0') printf("取得头结点失败!\n"); else printf("头结点为%c\n", dat); break; case 2: printf("输入想入栈的字符:\n"); dat = getchar(); q = Linkstack_In(q, dat); break; case 3: q = Linkstack_Out(q, &dat); if(dat != '\0') printf("出栈的字符为%c\n", dat); break; case 4: printf("输出的字符依次为:\n"); ShowLinkstack(q); break; case 5: return 0; break; default: printf("选择无效!\n"); break; } } return 1; } //链栈置空 void Linkstack_SetNull(linkstack *q) { linkstack *s; while(q != NULL) //链栈置空时需要释放每个结点的空间 { s = q; q = q->next; free(s); } } //判断链栈是否为空 int Linkstack_Empty(linkstack *q) { if(q == NULL) return 1; else return 0; } //创建链栈 linkstack * Linkstack_Create() { linkstack *q = NULL; char ch; Linkstack_SetNull(q); ch = getchar(); while(ch != '#') { // q = (linkstack*)malloc(sizeof(linkstack)); //此句又让人纠结了好久,有此句时创建的链栈只有栈顶字符,申请了两次空间(下面入栈函数中一次),至于为什么会造成这种结果,暂时不知道- -!! q = Linkstack_In(q, ch); ch = getchar(); } return q; } //取得栈顶结点 char Linkstack_GetTop(linkstack *q) { if(Linkstack_Empty(q)) //先要判断栈顶是否为空 return '\0'; else return q->data; } //入栈,返回栈顶结点指针 linkstack *Linkstack_In(linkstack *q, char dat) { linkstack *e; e = (linkstack*)malloc(sizeof(linkstack)); e->data = dat; e->next = q; return e; } //出栈,返回栈顶结点指针 linkstack *Linkstack_Out(linkstack *q, char *dat) { linkstack *s; if(Linkstack_Empty(q)) //先要判断栈顶是否为空 { *dat = '\0'; return NULL; } else { *dat = q->data; s = q; q = q->next; free(s); return q; } } //输出显示链栈,从栈顶到栈底 void ShowLinkstack(linkstack *q) { linkstack *s; s = q; while(s != NULL) { putchar(s->data); putchar(' '); s = s->next; } printf("\n"); }
相关文章推荐
- 数据结构学习之双向循环链表的基本操作(非递归实现)
- 数据结构 链栈的基本操作
- 数据结构的串的顺序存储的基本操作(学习历程)
- 数据结构 - C语言版 - 链栈 所有基本操作
- 数据结构学习一(单链表的操作)
- 数据结构_链栈的建立与相关操作_C语言源代码
- 新手学习数据结构与算法---单链表的基本操作
- [数据结构学习]单链表常用操作
- 数据结构 链栈的基本操作
- python数据结构之列表基本操作[学习笔记]
- 数据结构 - 链栈的基本操作(C语言)
- [数据结构]c语言实现链栈的入栈,出栈,清空,销毁等操作
- 【JAVAWEB学习笔记】28_jquery加强:json数据结构、jquery的ajax操作和表单校验插件
- 数据结构学习笔记(二) 链表之单链表的基本操作
- 数据结构学习心得——顺序栈和链栈
- 数据结构学习---线性表顺序存储结构的基本操作
- 数据结构学习---线性表顺序存储结构的应用(二):插入操作
- 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
- 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
- 数据结构学习笔记:顺序栈与链栈