栈的顺序存储和链式存储c语言实现
一. 栈
栈的定义:栈是只允许在一端进行插入或删除操作的线性表。
1.栈的顺序存储
栈顶指针:S.top,初始设为-1
栈顶元素:S.data[S.top]
进栈操作:栈不满时,栈顶指针先加1,再到栈顶元素
出栈操作:栈非空时,先取栈顶元素,再栈顶指针减1
栈空条件:S.top=-1
栈满条件:S.top=MaxSize-1
栈长:S.top+1
(1)结构
typedef struct{
ElemType data[MaxSize];
int top;//栈顶
}Stack;
(2)初始化空栈
Stack InitStack()
{
Stack S;
S.top=-;
return S;
}
(3)判断栈是否为空
int StackEmpty(Stack S)
{
if(S.top==-)
{
return TRUE;
}
else
{
return FALSE;
}
}
(4)进栈
int PushStack(Stack *p,ElemType x)
{
if(p->top==MaxSize-)
{
printf("栈满!\n");
return FALSE;
}
p->data[++p->top]=x;//指针先加1,再入栈
return TRUE;
}
(5)出栈
int PopStack(Stack *p,ElemType *x)
{
if(p->top==-)
{
printf("栈空!\n");
return FALSE;
}
*x=p->data[p->top--];//先出栈,指针再减1
return TRUE;
}
(6)读栈顶元素
ElemType GetTop(Stack S)
{
if(S.top==-)
{
printf("栈空!无法读取栈顶元素!\n");
}
else
{
return S.data[S.top];
} }
2.栈的链式存储

链栈便于多个栈共享存储空间和提高效率,规定所有操作都是再单链表的表头进行,没有用头结点,直接头指针指向栈顶元素。
(1)结构
struct NodeStack{
ElemType data;
struct NodeStack *next;
};
(2)初始化链栈
NodeStack* Init_NodeStack()
{
NodeStack *p;
p=(NodeStack*)malloc(sizeof(NodeStack));
p->next=NULL;
return p;
}
(3)判断链栈是否为空
int NodeStack_Empty(NodeStack *head)
{
if(!head->next)
{
return TRUE;
}
else
{
return FALSE;
}
}
(4)入栈
void Push_NodeStack(NodeStack *head)
{
NodeStack *p=(NodeStack*)malloc(sizeof(NodeStack));
ElemType x;
printf("输入入栈元素:");
scanf("%d",&x);
p->data=x;
p->next=head->next;
head->next=p;
}
(5)出栈
void Pop_NodeStack(NodeStack *head)
{
NodeStack *p=(NodeStack*)malloc(sizeof(NodeStack));
p=head->next;
head->next=p->next;
free(p);
}
(6)显示栈元素
void Print_NodeStack(NodeStack *head)
{
NodeStack *p=head;
printf("栈元素:");
while(p->next)
{
printf("%d ",p->next->data);
p=p->next;
}
printf("\n");
}
运行示例:

栈的顺序存储和链式存储c语言实现的更多相关文章
- 队列的顺序存储与链式存储c语言实现
一. 队列 1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表. 2.循环队列:把存储队列的顺序队列在逻辑上视为一个环. 循环队列状态: 初始时:Q.front=Q.rear=0 ...
- 线性表的顺序存储和链式存储c语言实现
一.线性表的顺序存储 typedef int ElemType;typedef struct List { ElemType *data;//动态分配 ,需要申请空间 int length; }Lis ...
- 数据结构导论 四 线性表的顺序存储VS链式存储
前几章已经介绍到了顺序存储.链式存储 顺序存储:初始化.插入.删除.定位 链式存储:初始化.插入.删除.定位 顺序存储:初始化 strudt student{ int ID://ID char nam ...
- 【Java】 大话数据结构(6) 栈的顺序与链式存储
本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所 ...
- 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)
温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...
- 线性表的顺序存储和链式存储的实现(C)
//线性表的顺序存储 #include <stdio.h>typedef int DataType;#define MaxSize 15//定义顺序表typedef struct { Da ...
- C 数据结构1——线性表分析(顺序存储、链式存储)
之前是由于学校工作室招新,跟着大伙工作室招新训练营学习数据结构,那个时候,纯碎是小白(至少比现在白很多)那个时候,学习数据结构,真的是一脸茫然,虽然写出来了,但真的不知道在干嘛.调试过程中,各种bug ...
- 线性表的链式存储C语言版
#include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...
- 线性表的链式存储——C语言实现
SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...
随机推荐
- Java实现 蓝桥杯VIP 算法训练 递归求二进制表示位数
问题描述 给定一个十进制整数,返回其对应的二进制数的位数.例如,输入十进制数9,其对应的二进制数是1001,因此位数是4. 样例输入 一个满足题目要求的输入范例. 9 样例输出 与上面的样例输入对应的 ...
- Java实现 LeetCode 95 不同的二叉搜索树 II(二)
95. 不同的二叉搜索树 II 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1, ...
- SQLServer2019安装教程
可以去官网下载,我百度网盘也有都一样 https://pan.baidu.com/s/1i3umqHXSUMbxJ9rRi6mU4A 提取码:5g9q 打开应用程序 点击安装,点第一个全新得SQL s ...
- Java实现 LeetCode 23 合并K个排序链表
23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输 ...
- Java实现九阶数独
你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独 ...
- TZOJ 公交车
描述 公交车在一条笔直的道路(道路宽度忽略,设为X轴)上行驶,按顺序路上有若干个站点(X坐标值),crq的家也在道路旁某个位置h(X坐标值),现在crq想知道哪个站点下车离家最近. 输入 输入数据的第 ...
- Java操作符,<<、>>等
数学意义:在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方. 计算:3 << 2 3 << 2,则是将数字3左移2位 1. ...
- Docker+Selenium+TestNG+Maven+Jenkins环境搭建
一.Selenium环境准备 standalone-chrome Docker容器启动: docker pull selenium/standalone-chrome version: '3' ser ...
- 关于前端JS走马灯(marquee)总结
方案一: <marquee width="360" scrolldelay="20" scrollamount="2" onclick ...
- MySQL连接查询驱动表被驱动表以及性能优化
准备我们需要的表结构和数据 两张表 studnet(学生)表和score(成绩)表, 创建表的SQL语句如下 CREATE TABLE `student` ( `id` int(11) NOT NUL ...