链栈的基本操作(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 ...
随机推荐
- css3 vw、vh属性详解,以及与%、rem的区别介绍
最近的项目需求,内嵌电视端显示页面,所以使用到了css3的属性:vw \ vh,遇到一些问题,记录下来 vw.vh是什么? 字面上可以简单理解为,vw (view width),vh(view hei ...
- 调整数组顺序使奇数位于偶数前面(python)
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. # -*- codi ...
- HDU-2612.Find way .(不同起点不同终点的BFS)
我要被这个好用的memset气死了...... 真香 #include <cstring> #include <string> int main () { ]; memset( ...
- 207. Course Schedule(Graph; BFS)
There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...
- LinearLayout 线性布局
android:orientation 设置布局管理器内组件的排列方式,可设置为 horizontal (水平排列).vertical (垂直排列) android:gravity 设置布局管理器内组 ...
- unity农场模拟经营游戏源码
下载地址: https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-12305352547.10.25ca3c4eWAibvf&id=56 ...
- Cisco 4507R+E四引擎VSS故障解决
如果可以要做双引擎VSS(每个机箱1个引擎), 3.6.7版本可以实现 如果需要做4引擎VSS(每个机箱2个引擎) 请使用3.8.x和之后的版本.
- 食物链(带权&种类并查集)
食物链 http://poj.org/problem?id=1182 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9326 ...
- JSP中的数据库操作,MySQL基础操作(一)
一.JDBC JDBC(java data base concectivity),是一种用于执行SQL语句的java API,可以为多种关系库提供统一访问. 通常使用JDBC完成以下操作: 1)同数据 ...
- 操作符offset
操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址. assume cs:codesg codesg segment start: mov ax, offset star ...