数据结构(C实现)------- 链栈

描述:     

链栈,即栈的链式存储结构,链栈通常使用不带头结点的单链表来表示,因此其结点的结构和单链表的结点结构相同。

在一个链栈中,栈底就是链表的最后一个结点,而栈顶总是链表的第一个结点。因此,新入栈的元素即为链表中采用头插法新加入的结点,一个链栈可以由栈顶指针唯一确定,当top为NULL时,则表示该栈是一个空的链栈。

 实现:

  链栈结点的类型描述:

typedef int ElemType;
typedef struct node{
	ElemType data;
	struct node *next;
}LinkNode,*LinkStack;

基本操作

1.  初始化链栈Init_LinkStack()

链栈的初始化操作就是创建一个不带头结点的空的单链表,如下:

//初始化链栈
LinkStack Init_LinkStack(){
	LinkStack S;
	S = NULL;
	return S;
}

2. 判断链栈空IsEmpty_LinkStack(LinkStack top)

根据定义,当栈顶指针top为NULL时,表示该结点为一个空栈,返回1,否则,则返回0 。

//判断链栈空
int IsEmpty_LinkStack(LinkStack top){
	if(top == NULL)
		return 1;
	else
		return 0;
}

3. 入链栈Push_SqStack(SqStack* S,ElemType x)

入栈,即向栈中插入一个元素作为新的栈顶元素,首先要动态申请一个结点作为新元素的存储空间,然后将新数据元素写入申请的存储空间中,并将栈顶指针top的值写入新结点中的指针域,最后将栈顶指针指向新插入的结点,代码如下:

//入栈操作
void Push_SqStack(SqStack* S,ElemType x){
	//栈满,则退出
	if(isFull_SqStack(S)){
		printf("栈满!\n");
		exit(0);
	}
	else{
		S->data[++(S->top)] = x;
	}
}

  4. 出链栈Pop_SqStack(SqStack* S,ElemType* x)

出栈,即从栈中输出一个元素,并将其删除,具体过程为:当栈顶元素出栈时,先判断栈顶指针是否为空,如果空,则输出提示信息并退出,否则,取出栈顶元素的值返回,然后,将栈顶指针向后移动,并且释放掉被删除栈顶元素的存储空间。

//出栈
void Pop_SqStack(SqStack* S,ElemType* x){
	//如果栈空,则输出提示信息,并退出
	if(isEmpty_SqStack(S)){
		printf("栈空!\n");
		exit(0);
	}
	else
		*x =  S->data[S->top--];
}

5. 读取链栈顶元素Top_SqStack(SqStack* S,ElemType* x)

      读取链栈顶元素与出栈不同,二者的区别在于:读取栈顶元素时,栈顶指针不发生变化,仅取得栈顶元素的值;而出栈则还要将栈顶元素删除,在此时栈顶指针也要发生变化;但二者都要判断栈是否为空。

//读取栈顶元素
void Top_SqStack(SqStack* S,ElemType* x){
	if(isEmpty_SqStack(S)){
		printf("栈空!\n");
		exit(0);
	}
	else
		*x = S->data[S->top];
}

6. 输出栈中所有的元素Print_SqStack(SqStack* S)

从栈顶开始遍历整个链栈,输出所有的元素,同样,需要判断链栈是否为空。

//输出整个栈
void Print_SqStack(SqStack* S){
	if(isEmpty_SqStack(S)){
		printf("栈空!\n");
		exit(0);
	}
	int length = S->top;
	while(length > -1)
		printf("%d\t",S->data[length--]);
	printf("\n");
}

说明:

以上只是链栈最基本的操作,当然了,在实际应用中,往往不仅涉及入栈和出栈等操作,而且还需要对非栈顶的元素进行访问。

 顺序栈和链栈的比较:

1. 顺序栈易于根据栈顶指针的位置进行相对位移,快速定位并读取栈的内部元素,因此,顺序栈比链栈应用更广泛。

2. 顺序栈读取内部元素的时间复杂度为O(1),链栈读取内部元素的时间复杂度为O(n),其中,n为链栈的长度。

时间: 2024-11-22 18:32:38

数据结构(C实现)------- 链栈的相关文章

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

5.蛤蟆的数据结构笔记之五链栈实现 本篇名言:"人生就像奕棋,一步失误,全盘皆输." 昨天对栈和队列进行了定义.这次我们来看下如何使用代码来实现链栈和链队列,后续蛤蟆会记录如何将栈应用到实际问题中. 栈一般是顺序结构,但是也可以采用链式存储结构,具体如下实现. 欢迎转载,转载请标明出处: 1.  定义结构体 #define MAX_STACKS10 typedef struct { intkey; /*otherfields */ }element; typedef struct st

数据结构与算法——链栈

今天总结链栈. 什么是链栈? 链栈就是栈的链式存储结构,就跟单链表差不多.只不过头指针变成了栈顶指针,这个指针总是指向栈顶元素.栈底结点的指针域指向NULL,当top==NULL时,则栈为空.具体实现时,对比着单链表,然后结合图示,很容易就写出来了. 图示: 实现: <span style="font-family:Courier New;font-size:14px;">#include <iostream> using namespace std; temp

小猪的数据结构辅助教程——3.2 栈与队列中的链栈

小猪的数据结构辅助教程--3.2 栈与队列中的链栈 标签(空格分隔): 数据结构 1.本节引言: 嗯,本节没有学习路线图哈,因为栈我们一般都用的是顺序栈,链栈还是顺带提一提吧, 栈因为只是栈顶来做插入和删除操作,所以较好的方法是将栈顶放在单链表的头部,栈顶 指针与单链表的头指针合二为一~所以本节只是讲下链栈的存储结构和基本操作! 2.链栈的存储结构与示意图 存储结构: typedef struct StackNode { SElemType data; //存放的数据 struct StackN

数据结构4_链栈

用指针方式实现栈,相对于顺序栈,指针方式不用指定栈的大小, 先定义一个栈节点类,再定义一个链栈类,为使链栈类能访问栈节点的元素,设链栈类为栈节点类的友元类. #include<iostream>using namespace std;class LinkStack;class StackNode   //设计每个节点的类型{    char *data;    StackNode *next;    friend class LinkStack;   //设置友元类,以便LinkStack类访

数据结构之自建算法库——链栈

本文针对数据结构基础系列网络课程(3):栈和队列中第4课时栈的链式存储结构及其基本运算实现. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 链栈算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:listack.h,包含定义链栈数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef LISTACK_H_INCLUDED #define LISTACK_H_INCLUDED typedef char ElemType; typede

链栈--(大话数据结构97页)

//链栈的实现 --大话数据结构99页 #include <iostream> using namespace std; //链节点定义 typedef struct stacknode { int data; struct stacknode * next; }StackNode, *LinkStackptr; //定义链栈,头指针 和 长度 struct LinkStack{ LinkStackptr top; int count; }; //初始化void InitStack(LinkS

数据结构 - 链栈的实行(C语言)

数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部(如下图所示).另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的. 对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候. 链栈的结构代码如下: /* 链栈

数据结构(java语言描述)链栈的定义

1.定义栈接口 package stack;public interface Istack {    public void clear();    public boolean isEmpty();    public int length();    public Object peek();    public void push(Object x) throws Exception;    public Object pop();} 2.定义Node结点 package stack; i

数据结构(二):栈与链栈

#include <cstdio> #include <windows.h> #define MAXSIZE 100 struct Node { int data[MAXSIZE]; int top; }; typedef struct Node MyStack; //初始化 void MyStackInit(MyStack S) { S.top = -1; } //判空 BOOL MyStackEmpty(MyStack S) { if (S.top == -1) return