数据结构 - 栈的链式存储

栈的链式存储

1 栈的链式表示

栈的链式存储结构称为链栈,是运算受限的单链表。其插入和删除操作只能在表头位置上进行。因此,链栈没有必要像单链表那样附加头结点,栈顶指针top就是链表的头指针。图3-4是栈的链式存储表示形式。

链栈的结点类型说明如下:
typedef  struct  Snode
{  ElemType   data ;
struct Snode  *next ;
} SNode, *Link_Stack ;

链栈基本操作的实现

2  链栈基本操作的实现
(1) 栈的初始化
SNode *Init_Link_Stack(void)
{  SNode *top ;
top=(SNode *)malloc(sizeof(SNode)) ;
if(top==NULL)
   return ERROR;
else
{   top->next=NULL ;
     return(top) ;}
}
(2)  压栈(元素进栈)
Status push(SNode *top , ElemType  e)
{   SNode *p ;
p=(SNode *)malloc(sizeof(SNode)) ;
if (!p)  return  ERROR;
/*  申请新结点失败,返回错误标志 */
p->data=e ;
p->next=top->next  ;
top->next=p ;    /*  钩链  */
return OK;
}注意:1、与头插入法建立链表类似
 2、此处top结点的数据域不放数据,也可设置成存放数据,程序如何改?
(3)  弹栈(元素出栈)
ElemType pop(SNode *top )
/*  将栈顶元素出栈  */
{   SNode *p ;
ElemType  e ;
if  (top->next==NULL )
return ERROR ;    /*  栈空,返回错误标志    */
p=top->next ; e=p->data ;    /*  取栈顶元素  */
top->next=p->next ;     /*  修改栈顶指针  */
free(p) ;
return OK ;
}

输出栈中元素

void print(SqStack *S)
{
    int c;
    cout<<"输出栈中元素"<<endl;

    for( c=S.top--;c>=0;c--)
    {
        cout<<S.bottom[c]<<endl;
    }

}

栈与递归调用的实现

栈的另一个重要应用是在程序设计语言中实现递归调用。
递归调用:一个函数(或过程)直接或间接地调用自己本身,简称递归(Recursive)。
递归是程序设计中的一个强有力的工具。因为递归函数结构清晰,程序易读,正确性很容易得到证明。
为了使递归调用不至于无终止地进行下去,实际上有效的递归调用函数(或过程)应包括两部分:递推规则(方法),终止条件。

系统实现递归需要一个系统栈 (递归工作栈) ,用于在程序运行时处理函数调用。

系统栈是一块特殊的存储区。当一个函数被调用时,系统创建一个工作记录,称为栈桢(stack frame),并将其置于栈顶。

初始时只包括返回地址和指向上一栈的指针。

当该函数调用另一个函数时,该函数的局部变量、参数将加到它的栈桢中。

一个函数运行结束,将从栈中删除它的栈桢,程序控制返回原调用函数继续执行下去。

从被调函数返回调用函数的一般步骤

若栈为空,则执行正常返回。

否则,从栈顶弹出一个工作记录,将“工作记录”中的参数值、局部变量值赋给相应的变量;。

读取返回地址,将函数值赋给相应的变量。

转移到返回地址。

递归算法的优缺点

优点

程序非常简洁而清晰,并且易于分析,可读性较强。

缺点

费空间:系统实现递归需要一个系统栈,用于在程序运行时间处理函数调用。

费时:局部变量、形式参数和返回地址的进栈、出栈以及参数的传递需要费时,而且递归中的重复计算也很浪费时间。

时间: 2024-12-19 11:55:42

数据结构 - 栈的链式存储的相关文章

数据结构_线性表_顺序存储之1顺序栈2共享栈_链式存储之链栈_栈的应用举例

1>//栈是先进后出,后进先出的线性表 简称LIFO线性表 //栈的顺序存储结构成为顺序栈(sequebtial stack). //顺序栈利用一组地址连的存储单元依次存放从栈底到 栈顶的数据元素,通常用一维数组存放栈的元素 //"指针"top并非指针,而是表示栈顶元素的当前位置 //top不是指针型变量而是整形变量,top=0空栈,top=MaxSize 表示满栈,当top>maxsize 表示栈溢出 代码 #include <stdio.h> #includ

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

栈的链式存储及基本操作

栈的链式存储结构称为链栈,它是运算受限的单链表,其插入和删除操作仅限制在栈顶进行. 先将练习结果贴下 相关C代码如下: /*数据结构之栈*/ #include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef int DataType; /*定义栈的结构体类型*/ typedef struct NODE{ DataType data; NODE * pNext; }Node,* PNode; typede

栈及栈的链式存储结构(栈链)

栈:线性结构,后进先出.栈(Stack)是一种特殊的线性表(顺序表,链表)只在表尾进行删除和插入操作. 注意:对于栈来说,表尾称为栈的栈顶(top),表头称为栈底(bottom). 栈也是线性结构的一种特例.与队列不同,他只有一个口,只能从这里读或者写数据,这个口称为栈顶(top).栈是一种先进后出的数据结构.先进来的元素会放入栈底,而后进来的元素被放在它的上面,最后进来的元素的上面的位置,称为栈顶. 栈所提供的操作比一般的线性表要少很多,只提供:初始化.销毁.判断是否为空.求栈的长度.清空栈.

栈的链式存储构架

定义 栈是限定只能在表尾删除和插入操作的线性表. 允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom).栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构. 栈的插入操作称为进栈,也称压栈.入栈. 栈的删除操作称为出栈,也称弹栈. 栈的抽象数据结构 由于栈本身就是一个线性表,所以线性表的操作特性它都具备,针对它的特殊性,在它的操作上可能会有一些变化.将进栈和出栈分别改名为push和pop. 由于栈本身是一个线性表,所以线性表的顺序存储结构和链式存储

栈的链式存储结构及应用(C、Java代码)

链式存储结构最大的好处就是没有空间的限制,可以通过指针指向将结点像以链的形式把结点链接,我们熟悉的线性表就有链式存储结构. 当然,栈同样有链式存储结构,栈的链式存储结构,简称链栈. 从图片可以看到,和单链表很像,拥有一个头指针top,又称作栈顶指针,所以此时就不再需要单链表里面的头结点了. 对于链栈来说,基本不存在栈满的情况,除非计算机内存已经没有了可使用的空间,如果真的存在,那么计算机系统已经面临着即将死机崩溃的情况,而不是这个链栈是否溢出的问题了. 对于空栈来说,链表的定义是头指针指向NUL

数据结构-队列-顺序链式存储

定义 队列(Queue):队列简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除.向队列中插入元素称为入队或进队:删除元素称为出队或离队. 队列的操作 队列不可以读取对中间的元素. 队列的存储结构 顺序存储 链式存储 顺序存储 队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针front 和rear分别指示队头元素和队尾元素的位置. 设队头指针指向队头元素,队尾指针指向队尾 元素的下一个位置(也可以让rear指向队尾元素,front指向队头元

栈的链式存储 - API实现

基本概念 其他概念详情参看前一篇博文:栈的顺序存储 - 设计与实现 - API实现 这里也是运用了链表的链式存储API快速实现了栈的API. 代码: // linkstack.h // 链式存储栈的API声明 #ifndef _MY_LINKSTACK_H_ #define _MY_LINKSTACK_H_ typedef void LinkStack; // 创建栈 LinkStack* LinkStack_Create(); // 销毁栈 void LinkStack_Destroy(Lin

栈(链式存储结构)

堆栈:具有一定操作约束的线性表,只能在一端作插入.删除 具有后入先出的特性(Last In First Out) 分顺序存储结构.链式存储结构两种形式 堆栈的顺序存储结构 通常由一个一维数组和一个栈顶元素变量组成 图解如下: 形式一:构建结构体 0.结构初始化 #define MaxSize ### struct StackNode { ElementType Data[MaxSize]; int top; }; 1.建立空栈 struct StackNode* createStack() {