栈的链式储存结构称为链栈。链栈的节点类型与链式线性表的节点类型

定义相同,不同的是它是仅在表头进行操作的单链表。链栈通常用不带头节

点的单链表来实现,栈顶指针就是链表的头指针 ,如图所示:

  代码如下:

 #include <stdio.h>
#include <stdlib.h> #define OK 1
#define ERROR 0
typedef int SElemType;
//栈的链式储存结构
typedef struct SNode {
SElemType data; //数据域
struct SNode *next; //指针域 }SNODE, *PSNODE;
//栈顶节点
typedef struct
{
PSNODE top; //栈顶指针
int count; //栈的长度 }LinkStack; //初始化栈顶节点
int Init_LS(LinkStack *s) {
s->top = (PSNODE)malloc(sizeof(SNODE));
if (!s->top)
return ERROR; s->top = NULL;
s->count = ;
return OK;
}
//判断栈是否为空
int Is_Empty(LinkStack *s) {
if (s->top == NULL)
{
printf("栈为空\n");
return OK;
} else {
printf("栈不为空\n");
return ERROR;
}
}
//遍历栈
int Traverse_LS(LinkStack *s) {
int i;
if (Is_Empty(s) == OK) return ERROR;
PSNODE p = s->top;
for(i=s->count;i>;i--)
{ printf("%d ", p->data);
p = p->next;
}
printf("\n");
return OK;
}
//链栈元素入栈
int Push_LS(LinkStack *s, SElemType e) { PSNODE p = (PSNODE)malloc(sizeof(SNODE));
if (!p) return ERROR;
p->data = e;
p->next = s->top; //新结点指向栈顶指针指向的地址
s->top = p; //更新栈顶指针
s->count++; // 节点增加1 return OK; }
// 获取栈顶元素
int GetTop(LinkStack *s, SElemType *e) {
if (Is_Empty(s) == OK) return ERROR;
*e = s->top->data;
return OK;
}
//链栈元素出栈
int Pop_LS(LinkStack *s, SElemType *e) {
if (Is_Empty(s) == OK) return ERROR; PSNODE temp = s->top;
*e = temp->data;
s->top = temp->next;
s->count--;
free(temp);
return OK;
}
//销毁栈
int Destroy_LS(LinkStack *s) {
PSNODE p,q=NULL;
if(Is_Empty(s)==OK) return ERROR;
p = s->top;
for (int i = s->count; i > ; i--)
{
q = p->next;
free(p);
p = q;
}
s->count = ;
return OK;
} int main() {
LinkStack s,*ps;
SElemType a, *e;
e = (SElemType*)malloc(sizeof(SElemType));
ps = &s;
Init_LS(ps);
int n;
Is_Empty(ps);
printf("请输入入栈元素的个数:");
scanf("%d", &n);
for(int i=;i<n;i++)
{
scanf("%d", &a);
Push_LS(ps, a);
}
Traverse_LS(ps);
Pop_LS(ps, e);
printf("弹出的元素为%d\n", *e);
Traverse_LS(ps);
GetTop(ps, e);
printf("栈顶元素为%d\n", *e);
if(Destroy_LS(ps)==OK) printf("栈销毁成功!"); return ;
}

  我写的这个链栈的代码 稍微修改了一点 --把栈顶指针与count 组成一个结构体

count用来储存链栈的长度。如果链栈的长度很长而且经常需要返回长度 一个一个

算的话显得特别费时间;而使用count要方便的多 。

  如果我们要把两个链栈合并,必然需要其中一个的栈底地址

而且如果这个链栈很大,我们要从栈顶开始寻找栈底地址 很麻烦吧

但是我们在LinkStack  中增加一个 PSNODE bottom指针,在入栈函数中

根据count来给bottom赋值。这样栈底地址就有了。

  所以,数据结构的一些细节上的东西不是一成不变的,而是可以根据具体

的问题修改。

链栈的基本操作(C语言)的更多相关文章

  1. C语言实现链栈以及基本操作

    链栈,即用链表实现栈存储结构.链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底,如下下图所示: 将链表头部作为 ...

  2. C++实现链栈的基本操作

    之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义例如以下: #ifndef CSTOCK_H_ #define CSTOCK_H_ ty ...

  3. 顺序栈的基本操作(C语言)

    由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址  但是这种用法好像C并不 ...

  4. 数据结构——Java实现链栈

    一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...

  5. C语言简单实现链栈基本几个功能(适合新手看,大神可指正)

            接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...

  6. C语言简单实现链栈基本几个功能

            接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...

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

    数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...

  8. 【小白成长撸】--链栈(C语言版)

    // 链栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #include <st ...

  9. C语言实现链栈的初始化&进栈&出栈&读取栈顶元素

    /*链表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typede ...

随机推荐

  1. NumPy IO

    NumPy IO Numpy 可以读写磁盘上的文本数据或二进制数据. NumPy 为 ndarray 对象引入了一个简单的文件格式:npy. npy 文件用于存储重建 ndarray 所需的数据.图形 ...

  2. C# 页面向controller中跳转匹配方法的时候,当controller中有两个重载方法时候,不发生跳转

    在ajax中的URL跳向controller一个方法时候,controller中有两个重载的方法,ajax不发生跳转,当删除另外一个方法之后,正常跳转. 不知道,是我自己写的有问题,还是control ...

  3. 使用vue-cli快速搭建大型单页应用

    前言: 经过一段时间angular的洗礼之后 ,还是决定回归Vue.现就vue安装.工程搭建.常用依赖安装直至开发挣个流程做一整理,希望对初学者有所帮助. 前提条件: 对 Node.js 和相关构建工 ...

  4. [剑指Offer]24-反转链表

    题目链接 https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId=11168&t ...

  5. http406错误

    The resource identified by this request is only capable of generating responses with characteristics ...

  6. c#引用命名空间的作用

    System 包含用于定义常用值和引用数据类型.事件和事件处理程序.接口.属性和处理异常的基础类和基类.其他类提供支持下列操作的服务:数据类型转换,方法参数操作,数学计算,远程和本地程序调用,应用程序 ...

  7. YII2开启路由配置后,新加的模块无法访问

    最近使用YII2,自定义创建了一个自定义模块users,位置为app\modules\users. 'modules' => [ 'users' => [ 'class' => 'a ...

  8. apache开启gzip压缩

    1.在httpd.conf中去掉下面的#号 LoadModule headers_module modules/mod_headers.so LoadModule deflate_module mod ...

  9. 1到n的整数中,1出现的次数

    参考链接:https://discuss.leetcode.com/topic/18054/4-lines-o-log-n-c-java-python 1到n的整数中,1出现的次数,如11中,1出现了 ...

  10. Hibernate: save, persist, update, merge, saveOrUpdate[z]

    [z]https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate 1. Introduction In this ...