链栈的基本操作(C语言)
栈的链式储存结构称为链栈。链栈的节点类型与链式线性表的节点类型
定义相同,不同的是它是仅在表头进行操作的单链表。链栈通常用不带头节
点的单链表来实现,栈顶指针就是链表的头指针 ,如图所示:
代码如下:
#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语言)的更多相关文章
- C语言实现链栈以及基本操作
链栈,即用链表实现栈存储结构.链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底,如下下图所示: 将链表头部作为 ...
- C++实现链栈的基本操作
之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义例如以下: #ifndef CSTOCK_H_ #define CSTOCK_H_ ty ...
- 顺序栈的基本操作(C语言)
由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址 但是这种用法好像C并不 ...
- 数据结构——Java实现链栈
一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...
- C语言简单实现链栈基本几个功能(适合新手看,大神可指正)
接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...
- C语言简单实现链栈基本几个功能
接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...
- 数据结构 - 链栈的实行(C语言)
数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...
- 【小白成长撸】--链栈(C语言版)
// 链栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #include <st ...
- C语言实现链栈的初始化&进栈&出栈&读取栈顶元素
/*链表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typede ...
随机推荐
- pta l2-4(这是二叉搜索树吗?)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192 题意:给定n以及n个整数,问该序列 ...
- 第十一章 串 (b2)蛮力匹配
- no module named cv2
运行python脚本时报错: ImportError: No module named cv2 第一想法: 使用命令: pip install cv2 会报错找不到请求的版本 解决方法: 使用命令 p ...
- CentOS ./configure && make && make install详解
码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install). 在Linux中利用源码包安装软件最重要的就是要仔细阅读安装包当中的README INST ...
- 【转】iOS 自动化性能采集
前言 对于iOS总体生态是比较封闭的,相比Android没有像adb这种可以查看内存.cpu的命令.在日常做性能测试,需要借助xcode中instruments查看内存.cpu等数据. 但是借助i ...
- unity农场模拟经营游戏源码
下载地址: https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-12305352547.10.25ca3c4eWAibvf&id=56 ...
- windows上安装Anaconda和python
下载并安装 anaconda 先到https://www.continuum.io/downloads 下载anaconda, 现在的版本有python2.7版本和python3.5版本,下载好对应版 ...
- VTP
VTP VLAN中继协议(Vlan Trunking Protocol),是CISCO专用协议.VTP负责在VTP域内同步VLAN信息,这样就不必在每个交换机上配置相同的VLAN信息.VTP还提供一种 ...
- 【校招面试 之 网络】第3题 HTTP请求行、请求头、请求体详解
1.HTTP请求报文解剖 HTTP请求报文由3部分组成(请求行+请求头+请求体): 下面是一个实际的请求报文: ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE.HEA ...
- SA9 collections
[定义] 表示object的集合 generic class:可以用于多种object, 抽象类的具体实现: [ArrayList] 动态添加,只能加Non-primitive type,要初始化长 ...