数据结构第三章栈和队列(一)

2023-11-08

//数据结构 第三章栈和队列
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define FALSE 0
#define TRUE 1
#define OK 1
#define ERROR 0
typedef int Status;
//栈的顺序存储表示

#define STACK_INIT_SIZE 100 //存储空间的初始分配量
#define STACKINCREAMENT 10  //存储空间分配增量

typedef char SElemType;
typedef struct
{
	SElemType *base;  //构造之前和销毁之后base的值为NULL
	SElemType *top;   //栈顶指针
	int stacksize;    //当前已分配的存储空间
}SqStack;
//基本操作的函数原型声明

//构造一个空栈
Status InitStack(SqStack *S);

//销毁栈S
Status DestroyStack(SqStack *S);

//把S置为空栈
Status ClearStack(SqStack *S);

//若栈为空栈返回TRUE
Status StackEmpty(SqStack S);

//返回栈的长度
int StackLength(SqStack S);

//返回栈顶元素
Status GetTop(SqStack S,SElemType *e);

//入栈
Status Push(SqStack *S,SElemType e);

//出栈
Status Pop(SqStack *S,SElemType *e);

//遍历栈
Status StackTraverse(SqStack S,Status( *visit)());

Status InitStack(SqStack *S)
{
	S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
	if(!S->base) exit(OVERFLOW);//存储分配失败
	S->top=S->base;
	S->stacksize=STACK_INIT_SIZE;
	return OK;
}
Status GetTop(SqStack S,SElemType *e)
{
	if(S.top==S.base) return ERROR;
	*e=*(S.top-1);
	return OK;
}
Status Push(SqStack *S,SElemType e)
{
	if(S->top-S->base>=S->stacksize)//栈满,追加存储空间
	{
		S->base=(SElemType *)realloc(S->base,(S->stacksize+STACKINCREAMENT)*sizeof(SElemType));
		if(!S->base) exit(OVERFLOW);
		S->top=S->base+S->stacksize;
		S->stacksize+=STACKINCREAMENT;
	}
	//入栈操作,完成操作后,top指针加1
	*S->top++=e;
	return OK;
}
Status Pop(SqStack *S,SElemType *e)
{
	if(S->base==S->top) return ERROR;
	*e=*--S->top;
	return OK;
}
Status StackEmpty(SqStack S)
{
	if(S.base==S.top)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
Status ClearStack(SqStack *S)
{
	S->top=S->base;
	return OK;
}
Status DestroyStack(SqStack *S)
{
	S->base=NULL;
	return OK;
}
//栈的应用举例,数制转转
void conversion(SqStack *S)
{
	//对于输入的任意一个非负十进制整数,打印输出其八进制数
	SElemType quotient;
	int N;
	InitStack(S);
	scanf("%d",&N);
	while(N)
	{
		Push(S,N%8);
		N=N/8;
	}
	while(!StackEmpty(*S))
	{
		Pop(S,&quotient);
		printf("%d",quotient);
	}
}
//行编辑程序
//如果从终端接收的一个字符既不是退格符也不是退行符,则将该字符入栈
//如果是一个退格符,则从栈顶删除一个字符,如果是一个退行符则将字符栈清空

void LineEdit(SqStack *S)
{
	char ch,c;
	ch=getchar();
	InitStack(S);
	while(ch!=EOF)
	{
		while(ch!=EOF && ch!='\n')
		{
			switch(ch)
			{
			case '#':Pop(S,&c); break;
			case '@':ClearStack(S); break;
			default:Push(S,ch); break;
			}
		
			ch=getchar();//从终端接收下一个字符
		}
	
	//将从栈底到栈顶的字符传送至调用过程的数据区
	ClearStack(S);//重置栈为空
	if(ch!=EOF) ch=getchar();
	}
	DestroyStack(S);
}

以下还有迷宫求解问题,表达式求值问题(计算器的核心原理)
栈与递归的实现,汉诺塔问题,马踏棋盘问题,八皇后问题等。
以后再单独列出来将,队列下一步再说。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构第三章栈和队列(一) 的相关文章

随机推荐

  • GDB 格式化结构体输出及记录到文件

    GDB 常用命令参考手册 set print address set print address on 打开地址输出 当程序显示函数信息时 GDB会显出函数的参数地址 系统默认为打开的 show print address 查看当前地址显示
  • JDBC五种连接方式详解

    目录 前言 二 JDBC程序编写步骤 1 总流程图如下 2 五种连接方式 2 1 数据库连接方式一 2 2 数据库连接方式二 2 3 数据库连接方式三 2 4 数据库连接方式四 2 5 数据库连接方式五 总结 前言 JDBC Java Da
  • 【计算机网络】 RTT和RTO

    文章目录 RTT 往返时延 RTO Retransmission Timeout 超时重传时间 RTT 往返时延 RTT Round Trip Time 是计算机网络中的一个重要的性能指标 表示从发送端发送数据开始 到发送端接收到来自接收端
  • STM32学习笔记——EXIT(外部中断)

    目录 一 什么是中断系统 二 中断系统执行流程 三 NVIC 提供中断控制器 CPU的好助手 1 NVIC的作用 STM32 2 NVIC优先级分组 四 EXTI 外部中断 1 EXTI简介 2 EXTI基本结构 3 EXTI框图 五 AF
  • elk笔记12--常见api和设置区别

    elk笔记12 常见api和设置区别 1 freeze 和 close 区别 1 1 freeze介绍 1 2 close介绍 2 persistent 和transient区别 3 两个allocation 说明 本文主要记录 es 中常
  • 《数据结构》将一个带头结点的单链表分解成两个单链表

    将一个带头结点的单链表分解成两个单链表 题目描述 设计一个算法 将一个带头结点的单链表分解成两个具有相同结构的 链表B和C 其中B白哦的结点为A中小于0的结点 C表的结点为A中大于0 的结点 要求B和C 仍利用A表的结点 A表的元素都是非0
  • pyqt5 QLabel详细用法

    QLabel控件类的主要API如下 setAlignment 设置文本的对齐方式 setIndent 设置文本缩进 text 获取文本内容 setText 设置文本内容 selectedText 返回所选择的字符 setBuddy 设置伙伴
  • OpenCV代码提取:遍历指定目录下指定文件的实现

    OpenCV 3 1之前的版本 在contrib目录下有提供遍历文件的函数 用起来比较方便 但是在最新的OpenCV 3 1版本给去除掉了 为了以后使用方便 这里将OpenCV 2 4 9中相关的函数给提取了出来 适合在Windows 64
  • python运行报错:‘NoneType‘ object is not callable

    NoneType object is not callable 空类型对象不可调用 调用了装饰器函数 但是装饰器函数没有返回值 导致使用的函数报错 参照代码的注释 timmer 引用装饰器等于test1 timmer func 所以timm
  • 字节跳动开源 Kelemetry:面向 Kubernetes 控制面的全局追踪系统

    动手点关注 干货不迷路 Kelemetry是字节跳动开发的用于Kubernetes控制平面的追踪系统 它从全局视角串联起多个 Kubernetes 组件的行为 追踪单个 Kubernetes 对象的完整生命周期以及不同对象之间的相互影响 通
  • MongoDB 获取数组中匹配到的第一个元素对象

    例如当前test库中的grade集合中有两条文档数据 如下图所示 相关的两个实体映射类如下 import lombok Data import org springframework data annotation Id import or
  • 政企数智办公潮水里的融云「答卷」

    在这张集合了党政机关 金融保险 交通 能源电力等中大型组织复杂办公需求的高难度答卷上 融云在扎实耐打的通信底层之上 保持灵活的身段和强大的进化能力 稳定而轻盈 在不断变化的环境中正在成为确定性本身 作者 皮爷 出品 产业家 如果说过去两年里
  • 报sslSocketFactory(SSLSocketFactory) not supported on JDK 9+

    使用OkHttpClient的时候 jdk版本1 8 0 151启动不会报错 但jdk版本1 8 0 202启动就会报错 应该是OkHttpClient jdk小版本号高了不行 修改代码如下 public class SSLSocketCl
  • 20.docker之DockerCompose基础进阶

    1 docker compose命令模板 docker compose yml 作用 compose以项目为核心 在项目中定义一组具有相同业务逻辑单元服务运行 注意 在编写docker compose yml文件时 所有的冒号 短横线 后面
  • Spring框架入门基础1:IOC---控制权反转

    Spring框架的优点 方便解耦 简化开发 Spring就是一个大工厂 可以将所有对象创建和依赖关系维护 交给Spring管理 这也是IOC的作用 IOC IOC就是控制反转 将创建对象的过程交给spring进行管理 可以用来减低计算机代码
  • linux命令练习-实验一

    实验序号 一 实验项目 熟悉常用的Linux操作 实验成绩 一 实验目的 为后续上机实验做准备 熟悉常用的Linux操作 1 了解安装Linux的方法 2 熟悉常用的Linux操作 二 实验内容 一 安装Linux Ubuntu 14 以上
  • [12]STM32-NVCI中断优先级管理

    前言 这一篇博客主要讲解NVCI中断优先级分组 优先级设置 因为还没有我还没学到做中断实验 所以有些地方我自己理解得也不是很透彻 这是看了原子哥的视频用自己的话来梳理一下思路 基础知识 STM32 有 84 个中断 包括 16 个内核中断和
  • 网络编程——基础知识

    全文目录 网络发展 协议 OSI七层模型 TCP IP五层 或四层 模型 网络传输 网络地址 IP地址 MAC地址 网络通信的本质 网络发展 网络没有出来之前计算机都是相互独立的 网络就是将独立的计算机连接在一起 局域网和广域网的区别只是范
  • 大数除法(模拟除)

    所谓大数除法就是很大的数 用unsigned long long 都存不下的数 的有关除法的运算 但是以下方法只适合求取高精度对低精度的大数除法可用 也就是说对被除数有限制 一般来说是在int 型的范围内的 include
  • 数据结构第三章栈和队列(一)

    数据结构 第三章栈和队列 include