数据结构(C语言版)---栈
1、栈:仅在表尾进行插入和删除操作的线性表。后进先出LIFO。
1)表尾端(允许插入和删除的一端)为栈顶,表头端(不允许插入和删除的一端)为栈底。
2)入栈:插入元素的操作。出栈:删除栈顶元素
3)栈的应用:数值转化、括号匹配检验、行编辑程序、迷宫求解、表达式求值
2、栈的两种存储表示方式
1)顺序栈(栈的顺序存储结构):利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。top=0表示空栈。
2)链栈(栈的链式存储结构);优点是便于多个栈共享存储空间和提高效率。
3、括号匹配检验
1)左括号,则进栈。
2)右括号,若栈为空,则右括号多。
3)右括号,与栈顶元素比较,若相等则左括号出栈,若不相等则不匹配。
4)表达式检验结束时,若栈空则匹配成功,否则左括号多。
4、栈的基本操作
InitStack(&S):构造空栈
DestroyStack(&S):销毁栈
ClearStack(&S):清空栈
StackEmpty(S):判断栈是否为空,若为空则返回true,否返回false
StackLength(S):返回栈的长度
GetTop(S,&e):用e返回栈的栈顶元素
Push(&S,e):插入e为新栈顶
Pop(&S,&e):删除栈顶元素,并用e返回其值。
5、共享栈:利用栈底位置相对不变性的特性,使得两个顺序栈共享一个一维数据空间,将两个栈底设置在共享空间的两端。
1)top0=-1时0号栈为空,top1=maxsize时1号栈为空,仅当两个栈顶指针相邻(top1-top0=1)时,栈满。
2)当0号栈进栈时top0先加1再赋值,1号栈进栈时top1先减1在赋值。
6、栈的顺序存储类型描述
typedef struct {
int data[maxsize];
int top;//栈顶指针,初始时设置S.top=-1,栈顶元素为:S.data[S.top],栈空条件:S.top==-1栈满条件:S.top==maxsize-1栈长:S.top+1
}Sqstack;
void initstack(Sqstack &S)
{
S.top = -1;
}
2)判断栈空
bool stackempty(Sqstack S)
{
if (S.top == -1)
{
return true;
}
else
{
return false;
}
}
3)进栈
bool push(Sqstack &S, int e)
{
if (S.top == maxsize - 1)
{
return false;
}
S.data[++S.top] = e;
return true;
}
5)出栈
bool pop(Sqstack &S, int &e)
{
if (S.top == -1)
{
return false;
}
e = S.data[S.top--];
return true;
}
6)读栈顶元素
bool GetTop(Sqstack S, int &e)
{
if (S.top == -1)
{
return false;
}
e = S.data[S.top--];
return true;
}
typedef struct Linkstack {
int data;
struct Linkstack *next;
}*Listack;
int judge(cha A[])
{
int i = j = k = 0;
while (A[i]!='\0')
{
switch (A[i])
{
case 'I':j++;
break;
case 'O':k++;
if (k > j)
{
printf("序列非法\n");
exit(0);
}
}
i++;
}
if (j != k)
{
printf("序列非法");
return false;
}
else
{
printf("序列合法");
return true;
}
}
2)设栈S1,S2都擦用顺序栈,并共享一个存储区[0,...,maxsize-1],采用栈顶相向、迎面增长的存储方式,出栈和入栈的实现。i为栈号,i=0表示左边的栈s1,i=1表示右边的栈s2,e为入栈元素。
typedef struct {
int stack[maxsize];
int top[2];
}stk;
stk s;
//入栈
int push1(int i, int e)
{
if (i < 0 || i>1)
{
printf("栈号输入错误");
exit(0);
}
if (s.top[1] - s.top[0] == 1)
{
printf("栈以满\n");
return 0;
}
switch (i)
{
case 0:s.stack[++s.top[0]] = e;
return 1;
break;
case 1:s.stack[--s.top[1]] = e;
return 1;
}
}
//出栈
int pop1(int i)
{
if (i < 0 || i>1)
{
printf("栈号输入错误\N");
exit(0);
}
switch (i)
{
case 0:
if (s.top[0] == -1)
{
printf("栈空\n");
return -1;
}
else
{
return s.stack[s.top[0]--];
}
case 1:
if (s.top[1] == maxsize)
{
printf("栈空\n");
return -1;
}
else
{
return s.stack[s.top[1]++];
}
}
}
数据结构(C语言版)---栈的更多相关文章
- 数据结构C语言版-栈
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <iostream> ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
<数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
- 【数据结构(C语言版)系列二】 栈
栈和队列是两种重要的线性结构.从数据结构角度看,栈和队列也是线性表,但它们是操作受限的线性表,因此,可称为限定性的数据结构.但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型. 栈的定 ...
- 深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器
在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #de ...
- 深入浅出数据结构C语言版(7)——特殊的表:队列与栈
从深入浅出数据结构(4)到(6),我们分别讨论了什么是表.什么是链表.为什么用链表以及如何用数组模拟链表(游标数组),而现在,我们要进入到对线性表(特意加了"线性"二字是因为存在多 ...
- 数据结构(C语言版)顺序栈相关算法的代码实现
这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...
随机推荐
- Contest 157
2019-10-06 12:15:28 总体感受:总体难度一般,dfs和dp题花了点时间,最后一题dp有思路,但是实现上不够好. 注意点:首先是hard问题的覆盖度依然是很大的问题,其次是要注意审题. ...
- innobackupex备份过程(有图有真相)
innobackupex命令构成: 1. Innobackupex内部封装了xtrabackup和mysqldump命令: 2. Xtrabackup是用来备份innoDB表的,内部实现对innoDB ...
- [JVM教程与调优] 了解JVM 堆内存溢出以及非堆内存溢出
在上一章中我们介绍了JVM运行时参数以及jstat指令相关内容:[JVM教程与调优] 什么是JVM运行时参数?.下面我们来介绍一下jmap+MAT内存溢出. 首先我们来介绍一下下JVM的内存结构. J ...
- 原 c++中map与unordered_map的区别
c++中map与unordered_map的区别 头文件 map: #include < map > unordered_map: #include < unordered_map ...
- 百道Python面试题实现,搞定Python编程就靠它
对于一般的机器学习求职者而言,最基础的就是掌握 Python 编程技巧,随后才是相关算法或知识点的掌握.在这篇文章中,我们将介绍一个 Python 练习题项目,它从算法练习题到机试实战题提供了众多问题 ...
- Springboot + Freemarker(一)
Maven pom文件配置 <parent> <groupId>org.springframework.boot</groupId> <artifactId& ...
- 1.NET Core 概述
.NET Core 概述 .NET Core是一个免费的.开源的.跨平台的.广泛使用的Web框架:它是由微软维护的.社区广泛参与支持的一个框架..NET Core可以运行在:Windows.MacOS ...
- Ubuntu虚拟机查看文件,目录颜色详解
查看文件 查看Home(不是home)目录下文件: [duanyongchun@localhost ~]$ ls 查看根目录下文件: [duanyongchun@localhost ~]$ cd / ...
- 一文搞懂 ThreadLocal 原理
当多线程访问共享可变数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要线程封闭出场了. 数据都被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中而避免使用同步的 ...
- centos替换源
!/bin/sh 本文原内容来自:https://github.com/judasn/Linux-Tutorial/blob/master/CentOS-Extra-Packages.md 可能额外需 ...