5、蛤蟆的数据结构笔记之五链栈实现

5、蛤蟆的数据结构笔记之五链栈实现

本篇名言:“人生就像奕棋,一步失误,全盘皆输。

昨天对栈和队列进行了定义。这次我们来看下如何使用代码来实现链栈和链队列,后续蛤蟆会记录如何将栈应用到实际问题中。

栈一般是顺序结构,但是也可以采用链式存储结构,具体如下实现。

欢迎转载,转载请标明出处:

1.  定义结构体

#define
MAX_STACKS10

typedef
struct {

intkey;

/*otherfields */

}element;

typedef
struct
stack *stack_pointer;

typedef
struct
stack {

elementitem;

stack_pointerlink;

};

stack_pointer top[MAX_STACKS];

两个结构体,其中一个结构包含在另一个结构体中。

定义了链栈中节点上限数量为10.

2.  链栈的插入

void add(stack_pointer *top,element
item)

{

stack_pointertemp = (stack_pointer)malloc(sizeof(stack));

if(IS_EMPTY(temp)){

fprintf(stderr,"Thememory is full\n");

exit(1);

}

temp->item=
item;

temp->link=*top;

*top =temp;

}

函数需要输入top 指向栈顶元素。需要入栈的元素,element。

3.  链栈的删除

删除节点函数,返回栈顶元素,并改变top,使其指向包含在其链域中的地址。典型调用item=deletenode(&top[stack_no]);

element deletenode(stack_pointer *top){

stack_pointertemp = *top;

elementitem;

if (IS_EMPTY(temp)){

fprintf(stderr,"Thestack is empty\n");

exit(1);

}

item =temp->item;

*top =temp->link;

free(temp);

returnitem;

}

4.  链栈输出

为便于调式,输出整个链栈中的值。

void print_node(
stack_pointer
top){

if (IS_EMPTY(top)){

fprintf(stderr,"Thestack is empty\n");

exit(1);

}

for(top;top;top=top->link)

{

printf("%d   ",top->item);

}

}

5.  链栈综合

如下代码实现一个综合性的测试,最后如下图 1所示:

void main()

{

inti;

elementtemp ;

for(i=0;i<10;i++)

{

top[i]=
NULL;

}

for(i=0;i<10;i++)

{

temp.key= i;

add(&header,temp);

}

printf("afteradd 10 nodes\n");

print_node(header);

printf("\n");

for(i=0;i<4;i++)

{

deletenode(&header);

}

printf("afterdelete 4 nodes\n");

print_node(header);

printf("\n");

for(i=0;i<6;i++)

{

deletenode(&header);

}

printf("afterdelete left 6 nodes\n");

print_node(header);

}

6.  链栈源码

方便大家编译,所有代码复制如下:

#include
"stdio.h"

#include
"stdlib.h"

#define
IS_EMPTY(ptr)(!(ptr))

#define
IS_FULL(ptr)  (!(ptr))

#define
MAX_STACKS10

typedef
struct
element{

intkey;

/*otherfields */

}element;

typedef
struct
stack *stack_pointer;

typedef
struct
stack {

elementitem;

stack_pointerlink;

}stack;

stack_pointer top[MAX_STACKS];

stack_pointer header =NULL;

void add(stack_pointer *top,element
item)

{

stack_pointertemp = (stack_pointer)malloc(sizeof(stack));

if(IS_EMPTY(temp)){

fprintf(stderr,"Thememory is full\n");

exit(1);

}

temp->item=
item;

temp->link=*top;

*top =temp;

header= temp;

}

element deletenode(stack_pointer *top){

stack_pointertemp = *top;

elementitem;

if (IS_EMPTY(temp)){

fprintf(stderr,"Thestack is empty\n");

exit(1);

}

item =temp->item;

header= temp->link;

free(temp);

returnitem;

}

void print_node(
stack_pointer
top){

if (IS_EMPTY(top)){

fprintf(stderr,"Thestack is empty\n");

exit(1);

}

for(top;top;top=top->link)

{

printf("%d   ",top->item);

}

}

void main()

{

inti;

elementtemp ;

for(i=0;i<10;i++)

{

top[i]=
NULL;

}

for(i=0;i<10;i++)

{

temp.key= i;

add(&header,temp);

}

printf("afteradd 10 nodes\n");

print_node(header);

printf("\n");

for(i=0;i<4;i++)

{

deletenode(&header);

}

printf("afterdelete 4 nodes\n");

print_node(header);

printf("\n");

for(i=0;i<6;i++)

{

deletenode(&header);

}

printf("afterdelete left 6 nodes\n");

print_node(header);

}

时间: 2024-12-29 09:56:10

5、蛤蟆的数据结构笔记之五链栈实现的相关文章

13、蛤蟆的数据结构笔记之十三栈的应用之栈与递归之斐波那契数列

13.蛤蟆的数据结构笔记之十三栈的应用之栈与递归之斐波那契数列 本篇名言:"人生不是一支短短的蜡烛,而是一支由我们暂时拿着的火炬,我们一定要把它燃得." 继续递归的斐波那契数列问题. 欢迎转载,转载请标明出处: 1.  斐波那契数列 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学

11、蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现

11.蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现 本篇名言:"人生不售来回票,一旦动身,绝不能复返." 继续栈应用实现,这次是来看下表达式求值的栈实现. 欢迎转载,转载请标明出处: 1.  表达式求值 表达式求值是设计语言编译中的一个基本问题,它的实现是栈应用的又一个典型例子. 任何一个表达式都是由操作数(Operand).运算符(operator)和界限符(delimiter)组成. 操作数可以是常数也可以是变量或变量的标识符. 运算符可以分为算术运算符.关系运算符和逻辑运算符

9、蛤蟆的数据结构笔记之九栈的应用之行编辑实现

9.蛤蟆的数据结构笔记之九栈的应用之行编辑实现 本篇名言:"人生照例是一场值得一搏的争衡,然而它的奖品是拼斗." 继续栈结构的应用,行编辑. 欢迎转载,转载请标明出处: 1.  行编辑 行编辑的功能是接受用户从终端输入的程序或数据.每接受一个字符即存入用户数据区的做法不是最恰当的.好的做法是建立一个缓存区,允许洪湖输入出错,并在发现有无时可以及时更正.用栈来实现这个输入缓冲区是非常适合的. 每当从终端接受了一个字符后先作判别,如果不是退格符也不是退行符,则将该字符压入栈顶:如果是退格符

14、蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数

14.蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数 本篇名言:"今天就是生命 ----- 是唯一你能确知的生命." 继续递归应用,阿克曼函数. 欢迎转载,转载请标明出处: 1.  阿克曼函数 阿克曼函数(Ackermann)是非原始递归函数的例子.它需要两个自然数作为输入值,输出一个自然数.它的输出值增长速度非常高,仅是对于(4,3)的输出已大得不能准确计算. Ackermann函数定义如下: 若m=0,返回n+1. 若m>0且n=0,返回Ackermann(m-1,1

7、蛤蟆的数据结构笔记之七栈的应用之数制转换

7.蛤蟆的数据结构笔记之七栈的应用之数制转换 本篇名言:"人生意义的大小,不在乎外界的变迁,而在乎内心的经验." 上面两篇中我们实现了链栈和链队列,接下去哦我们看看实际中栈的应用场景.本次来看下栈在数制转换的作用. 欢迎转载,转载请标明出处: 1.  原理介绍 十进制N和其他进制数的转换时计算机实现计算的基本问题.简单算法如下: N=(N div d )x d + N modd 2.  实现 2.1         定义结构体 定义堆栈的结构体 typedef struct { int

15、蛤蟆的数据结构笔记之十五栈的应用之栈与递归之八皇后问题

15.蛤蟆的数据结构笔记之十五栈的应用之栈与递归之八皇后问题 本篇名言:"人的一生应当这样度过:当回忆往事的时候,他不致于因为虚度年华而痛悔,也不致于因为过去的碌碌无为而羞愧:在临死的时候,他能够说:"我的整个生命和全部精力,都已经献给世界上最壮丽的事业--为人类的解放而斗争." 继续递归问题,本次是经典的八皇后问题: 欢迎转载,转载请标明出处: 1.  八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出

16、蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题

16.蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题 本篇名言:"人生的价值,并不是用时间,而是用深度去衡量的." 继续栈与递归应用,汉诺塔问题. 欢迎转载,转载请标明出处: 1.  汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一

4、蛤蟆的数据结构笔记之四栈和队列定义

4.蛤蟆的数据结构笔记之四栈和队列定义 本篇名言:"人生应该如蜡烛一样,从顶燃到底,一直都是光明的." 今天学习栈和队列了.从第二篇学习时候我们知道,其实也是线性表的一种. 我们先来看下定义. 欢迎转载,转载请标明出处: 1.  栈 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称

18、蛤蟆的数据结构笔记之十八链表实现稀疏矩阵

18.蛤蟆的数据结构笔记之十八链表实现稀疏矩阵 本篇名言:"必须如蜜蜂一样,采过许多花,才能酿出蜜来." 上篇中实现了栈在多项式实现中的例子,再来看下稀疏矩阵通过链表方式实现. 关键字:十字链表存储 欢迎转载,转载请标明出处: 1.  十字链表存储 十字链表(OrthogonalList)是有向图的另一种链式存储结构.该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的.用十字链表来存储有向图,可以达到高效的存取效果.同时,代码的可读性也会得到提升. 为便于理解后续代码,从网上摘了