数据结构
1.保存数据 2.处理数据
数组+操作
增查删改

栈和队列
是一种操作受限的线性表

栈 是先进后出 是在一端进行插入删除的操作--->栈顶 另一端叫做栈底(栈和栈区是两个概念)(是一种数据结构)
队列 是先进先出 是在两端进行插入删除的操作 在插入的一端叫做队尾 在删除的一端叫做队头

栈 需要回退操作 退回上一步(悔棋)
队列 多用于和时间有关的 比如消息(鼠标点击消息 键盘消息) 先来的先处理-->服务器请求
(举个比较恶心的例子 吃了吐--->栈 吃了拉---->队列)

例子
1、进制转换(栈)
2、队列的例子 入队 出队

测试代码笔记如下:

 //用栈实现 进制转换
#if 0
#include<stdio.h>
#include<stdbool.h> //判断真假 c++中的
//栈 1.线性表 (顺序表 链表的实现)
struct STACK
{
int arr[]; //数组
int size; //栈的大小 栈中最多可以存放多少的元素
int top; //栈顶 栈中不关心有多少元素 关心的是插入删除的位置
}; //初始化栈
void initStack(struct STACK*p)
{
p->top = ; //表示没有任何元素
p->size = ; //栈的大小
//栈顶就是即将要插入的数据的位置
//栈 是否是满 top==size
//top==0 表示栈中没有元素
} //栈的插入 入栈/压栈
void pushStack(struct STACK*p,int data)
{
if (p->top >= p->size)//表示栈满
{
printf("栈满,压栈失败!\n");
}
else
{
p->arr[p->top++] = data;
}
} //栈的删除 出栈
int popStack(struct STACK*p) //出一个元素 需要在外面得到这个元素 需要返回值
{
if (p->top <= ) //栈空
{
printf("没有元素,出栈失败!\n");
return ;
}
else
{
return p->arr[--(p->top)]; //出最后一个元素
}
} //判断栈是否为空
int isStackEmpty(struct STACK*p) //操作栈的时候会用
{
return p->top <= ; //返回值是1表示空 不然栈没空
} int main()
{
//进制转换 代码实现 不断除2求余 直到除到0的位置
//栈实现 余数栈
//十进制转换
int x = ;
printf("要转换的值是:%d\n", x);
//scanf_s("%d", &x);
struct STACK stack;
initStack(&stack); //栈初始化
while (x != )
{
pushStack(&stack, x % );
x /= ; //或x>>=1; 右移等于1相当于除以二 比除法快
}
//入完栈之后 出栈
printf("转换出的二进制是:");
while (isStackEmpty(&stack) != ) //表示栈没有空
{
printf("%d", popStack(&stack)); //出栈 %x打印16进制
}
//对于其他进制
//入栈 做处理 10-15 用A-F替换 -->if
getchar();
return ;
}
#endif /***************************分割线*********************************/
//队列的例子 队尾插入 队头删除
#if 1
//队
struct QUEUE
{
int arr[];
int size;
int begin; //队头
int end; //队尾
}; //初始化
void initQueue(struct QUEUE*p)
{
p->begin = p->end = ; //刚刚开始队列没有元素
p->size = ; //数组下标
/*
begin==end 队空
end+1-->begin的位置 队满
*/
} //入队 队尾操作
void inQueue(struct QUEUE*p, int data)
{
if ((p->end + ) % p->size == p->begin) //判断队列是否已满
{
return; //队列已满情况 只是表示退出函数 没有别的意思
}
else
{
p->arr[p->end++] = data; //插入
p->end %= p->size; //保证end+1之后 最后的end还是小于size
}
} //出队 队头操作
int outQueue(struct QUEUE*p)
{
if (p->begin == p->end) //队空 不操作 判断队是否满
{
return ; //返回一个0
}
else
{
int x = p->arr[p->begin]; //要出队的元素
p->begin = (p->begin + ) % p->size; //防止begin往后移动之后 等于size
return x; //返回要出队的元素
}
} int main()
{
struct QUEUE queue;
initQueue(&queue);
int y = ;
//入队
while (y != )
{
inQueue(&queue, y % ); //将余数入队
y >>= ;
}
//出队
while (queue.begin!=queue.end)
{
printf("%x", outQueue(&queue));
} getchar();
return ;
}
#endif #if 0
//ctf比赛 密码部分
//flag{c4es4r_variation}
//bg[`sZ*Zg'dPfP`VM_SXVd
#include<stdio.h>
int main()
{
int arr[] = { , , , , , , , , , , , , , , , , , , , , , };
printf("原样输出:\n");
for (int i = ; i < ; ++i)
{
printf("%d\t", arr[i]);
}
printf("\n");
printf("进行运算:\n");
int brr[] = { ,,,,,,,,,,,,,,,,,,,,, };
printf("结果输出:\n");
int crr[];
for (int i = ; i < ;++i)
crr[i] = arr[i] + brr[i];
for (int i = ; i < ; ++i)
printf("%d\t", crr[i]);
getchar();
return ;
}
#endif

附:

2019-03-31  19:41:48

C++学习(三十)(C语言部分)之 栈和队列的更多相关文章

  1. Java开发学习(三十六)----SpringBoot三种配置文件解析

    一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...

  2. Salesforce LWC学习(三十九) lwc下quick action的recordId的问题和解决方案

    本篇参考: https://developer.salesforce.com/docs/component-library/bundle/force:hasRecordId/documentation ...

  3. ElasticSearch7.3学习(三十二)----logstash三大插件(input、filter、output)及其综合示例

    1. Logstash输入插件 1.1 input介绍 logstash支持很多数据源,比如说file,http,jdbc,s3等等 图片上面只是一少部分.详情见网址:https://www.elas ...

  4. Collection集合重难点梳理,增强for注意事项和三种遍历的应用场景,栈和队列特点,数组和链表特点,ArrayList源码解析, LinkedList-源码解析

    重难点梳理 使用到的新单词: 1.collection[kəˈlekʃn] 聚集 2.empty[ˈempti] 空的 3.clear[klɪə(r)] 清除 4.iterator 迭代器 学习目标: ...

  5. 学习笔记:oracle学习三:SQL语言基础之sql语言简介、用户模式

    目录 1.sql语言简介 1.1 sql语言特点 1.2 sql语言分类 1.3 sql语言的编写规则 2.用户模式 2.1 模式与模式对象 2.2 实例模式scott 本系列是作为学习笔记,用于记录 ...

  6. ballerina 学习 三十 扩展开发(一)

    ballerina 主要是分为两大类 基于ballerina 语言开发的,一般是客户端的connector 使用java语言开发的(类似的基于jvm的都可以),一般是注解以及进行构件生成 baller ...

  7. 学习笔记:oracle学习三:SQL语言基础之检索数据:简单查询、筛选查询

    目录 1. 检索数据 1.1 简单查询 1.1.1 检索所有列 1.1.2 检索指定的列 1.1.3 查询日期列 1.1.4 带有表达式的select语句 1.1.5 为列指定别名 1.1.6 显示不 ...

  8. Salesforce LWC学习(三十) lwc superbadge项目实现

    本篇参考:https://trailhead.salesforce.com/content/learn/superbadges/superbadge_lwc_specialist 我们做lwc的学习时 ...

  9. Salesforce LWC学习(三十五) 使用 REST API实现不写Apex的批量创建/更新数据

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.224.0.api_rest.meta/api_rest/resources_compo ...

  10. Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析

    一.SpringBoot简介 SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程. 使用了 Spring 框架后已经简化了我 ...

随机推荐

  1. react router @4 和 vue路由 详解(全)

    react router @4 和 vue路由 本文大纲: 1.vue路由基础和使用 2.react-router @4用法 3.什么是包容性路由?什么是排他性路由? 4.react路由有两个重要的属 ...

  2. shell 字符串判断

    字符串的判断 '-z 字符串' 判断字符串是否为空(为空返回真) '-n 字符串' 判断字符串是否为非空(非空返回真) '字符串1==字符串2' 判断字符串1是否和字符串2相等(相等返回真) '字符串 ...

  3. am335x system upgrade uboot sd boot(一)

    由于上层应用的需求,需要运行arm docker,在kernel3.2上面还不支持,且编译器的glibc版本比较低的问题,故需要做系统升级 新的内核4.14.40驱动开发和以往有很大的不同,关键在于d ...

  4. 使用Jenkins自动编译 .net 项目

    使用Jenkins自动编译我的.net 项目   1.Jenkins是什么? Jenkins是一个可扩展的持续集成的引擎,主要用于持续自动的构建.测试软件项目 监控一些定时执行的任务.   2.安装配 ...

  5. PHP和Mysql事物处理

    这几天做支付的时候,又用到了事物,为了方便自己以后查看,今天闲的没事就把以前的东西整理下.(其中引用别人的东西,在这里谢谢他们贡献的代码!) 一.事务处理概述: 事务:是若干事件的集合 事务处理:当所 ...

  6. Cracking The Coding Interview 3.6

    // Write a program to sort a stack in ascending order. You should not make any assumptions about how ...

  7. 4.8 C++ typeid操作符

    参考:http://www.weixueyuan.net/view/6378.html 总结: typeid操作符用于判断表达式的类型,注意它和sizeof一样是一个操作符而不是函数. 如果需要使用t ...

  8. 4.5 C++重载、覆盖和遮蔽

    参考:http://www.weixueyuan.net/view/6375.html 总结: 函数签名包括函数名和函数参数的个数.顺序以及参数数据类型. 需要注意的是函数签名并不包含函数返回值部分, ...

  9. 关于Java的特点之封装

    抽象 1.简单理解 我们在前面去定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模版).这种研究问题的方法称为抽象. 封装--什么是封装 封装就是把抽象出来的数据和对 ...

  10. Docker(2):快速入门及常用命令

    什么是Docker? Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题.运维人员利用 Docker 可以在隔离容器中并行运行和管理 ...