首页 > 其他分享 >苏维埃日报06.栈与队列的最简单实现(?)

苏维埃日报06.栈与队列的最简单实现(?)

时间:2024-02-05 09:01:51浏览次数:29  
标签:ch 06 队列 苏维埃 int 数据结构 读入 101

前言

当年学数据结构的时候被栈和队列虐傻了
当年真的没搞清这俩的进出顺序
现在回过头来发现,退役了反而有点会了

一个不恰当的比喻


就像核糖体在mRNA上合成肽链一样,栈和队列的数据读入也是逐个读入
但输出的时候,数据是带特定顺序输出的,如栈先进后出,队列先进先出,但是线性多肽水解的时候是各个肽键一起断开,不像栈或者队列只能逐个输出

如何实现?

一维数据结构

在讲这两个数据结构之前,要先讲一下数据结构的维度
一般来说,单个的数据是没有维度的,可以看做零维的点
一维,就是用零维的点串成线
那么这样的数据结构叫一维数据结构,也叫线性数据结构
例:一维数组,字符串(为了方便,下文均只用一维数组演示)

int arr[101];
string str;

数据的读入

因为这种数据结构是一维的,因此,在读入的时候,数据可以是逐个读入的

输出数据

栈和队列的数据输出基本都需要逐个输出(这是一维数组的一个特性)

代码展示

栈(比较正常)

#include<iostream>
using namespace std;
int a[101];//这里用101个数据,是因为大概率碰不到需要特长的,而且定义在外边默认初始化
int main(){
	for(int i=1;i<=100;i++){
		/*这里i=1是因为前面写的是a[101],
		从a_0到a_100,但我喜欢从a_1开始*/
		cin>>a[i];//读入数据
	}
	for(int i=100;i>=1;i--){
		//反向循环输出数据
		cout<<a[i]<<" ";
	}
	return 0;
}

队列(比较正常)

#include<iostream>
using namespace std;
int a[101];//这里用101个数据,是因为大概率碰不到需要特长的,而且定义在外边默认初始化
int main(){
	for(int i=1;i<=100;i++){
		/*这里i=1是因为前面写的是a[101],
		从a_0到a_100,但我喜欢从a_1开始*/
		cin>>a[i];//读入数据
	}
	for(int i=1;i<=100;i++){
		//正向循环输出数据,这里和栈不同
		cout<<a[i]<<" ";
	}
	return 0;
}

代码优化

因为cincout的速度太慢,导致这个方法的时间复杂度巨大(?)
因此就需要用到UJC日报036里面提到的快读快写
因此代码优化如下:

#include<bits/stdc++.h>
using namespace std;
int a[101];//这里用101个数据,是因为大概率碰不到需要特长的,而且定义在外边默认初始化
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        /*二进制操作
        原理是将原二进制数向左平移 x 位
        右边原位置以 0 补齐*/ 
        ch=getchar();
    }
    return x*f;
}
inline void write(int x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9){
        write(x/10);//用递归取上一位 
    }
    putchar(x%10+48);
    /*
    48是0的askii值
    这里取末尾并转为字符输出
    */
}
int main(){
	for(int i=1;i<=100;i++){
		/*这里i=1是因为前面写的是a[101],
		从a_0到a_100,但我喜欢从a_1开始*/
		a[i]=read();//读入数据
	}
	for(int i=100;i>=1;i--){
		//反向循环输出数据
		write(a[i]);
		putchar(' ')
	}
	return 0;
}

队列

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        /*二进制操作
        原理是将原二进制数向左平移 x 位
        右边原位置以 0 补齐*/ 
        ch=getchar();
    }
    return x*f;
}
inline void write(int x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9){
        write(x/10);//用递归取上一位 
    }
    putchar(x%10+48);
    /*
    48是0的askii值
    这里取末尾并转为字符输出
    */
}
int a[101];//这里用101个数据,是因为大概率碰不到需要特长的,而且定义在外边默认初始化
int main(){
	for(int i=1;i<=100;i++){
		/*这里i=1是因为前面写的是a[101],
		从a_0到a_100,但我喜欢从a_1开始*/
		a[i]=read();//读入数据
	}
	for(int i=1;i<=100;i++){
		//正向循环输出数据,这里和栈不同
		write(a[i]);
		putchar(' ');
	}
	return 0;
}

标签:ch,06,队列,苏维埃,int,数据结构,读入,101
From: https://www.cnblogs.com/yingyouyu/p/18005589

相关文章

  • Linux进程间通信_共享内存和消息队列
    本文对SystemV标准的共享内存和消息队列这两种进程间通信方式进行讨论,涉及原理、系统调用接口以及相关的内核数据结构,并给出相关示例代码。SystemV共享内存基本原理进程间通信必须要让不同的进程看到同一份内存资源,因为进程具有独立性,所以这份内存资源是操作系统提供的,接口是由......
  • Nand2tetris Part1 lab04-lab06
    概述在前三个lab中,我们构建了hack计算机所需要的基础的芯片。后三个lab则是教我们如何使用这些芯片去搭建一个hack计算机并且使用汇编语言。Week04&Week05把这两个lab放在一起是因为他们给我的感觉更像是知识的互补。lab05教会你汇编语言的规范是什么,lab06则是......
  • Teamcenter AWC开发:调用SOA时,报错No SOA service for Bom-2008-06-StructureManagemen
    1、报错:2、分析:我一直在纠结,究竟是SOA接口报错。还是没有这个SOA接口服务。因为在AWC生成的SOA文档,是有这个接口和服务的。后来明白了。如果是SOA接口报错。在网络中看到这个接口是有响应的。也就是有返回的。 但是NoSOAservice报错,网络中,看到接口时没有返回的。 3......
  • 延迟队列-处理偶然性延迟任务的延迟队列
    目标:实现一个处理偶然事件的延迟队列。偶然事件发生的概率不高偶然事件一旦发生,事件的量多少不一期望偶然事件处理完成之后,能回收处理偶然事件的所有资源(因为偶然事件发生的概率低,所有分配的资源大部分时候都处于闲置状态) 思路:回收闲置资源发生偶然事件时,自动分配用于处......
  • JUC【1.原子类、2.锁Lock、3.阻塞队列、4.并发集合容器、5.并发工具类、6.线程池】、
    (JUC简介)转自极客时间1.JUC简介从JDK1.5起,JavaAPI中提供了java.util.concurrent(简称JUC)包,在此包中定义了并发编程中很常用的工具,比如:线程池、阻塞队列、同步器、原子类等等。JUC是JSR166标准规范的一个实现,JSR166以及JUC包的作者是同一个人DougLea。2.原......
  • Queue(队列)
    特性先进先出,允许再表的一端进行删除另一端进行插入运算。STL方式头文件#include<queue>定义queue<int>q;//建立一个队列q,其内部元素类型是int;函数q,push(a);//将元素a插入到队列q的末尾/q.pop();//删除队列q的队首元素。q.front();//查询q的队首元素。q.ba......
  • Problem P06. [算法课分治] 找到 k 个最长重复字符串
    注意是在该子字符串内每个字符的出现次数都不少于k。可以采用分治的方法,函数找一个不符合条件的字符,然后将字符串分成两个子字符串,就这样进行递归运算,每次找到符合条件的子字符串就判断一波长度,然后将最长的长度值存下来。#include<iostream>#include<bits/stdc++.h>#includ......
  • (10/60)用栈实现队列、用队列实现栈
    用栈实现队列实现思路用两个栈实现。入队用输入栈stIn,出队用输出栈stOut。实现pop()时,要注意pop只删除,不返回值。复杂度分析略注意点stack的pop只能弹出,不返回值;弹出并获取值分成:用top()记录栈顶值、用pop()弹出(删除)栈顶值。class方法调用要用->。代码实现classMyQu......
  • 堆(优先队列)
    堆是一种树形结构,树的根是堆顶,堆顶始终保持为所有元素的最优值。有大根堆和小根堆,大根堆的根节点是最大值,小根堆的根节点是最小值。堆一般用二叉树实现,称为二叉堆。堆的存储方式堆的操作empty返回堆是否为空top直接返回根节点的值,时间复杂度\(O(1)\)push将新元素添加在......
  • kafka系列(一)【消息队列、Kafka的基本概念、Kafka的工作机制、Kafka可满足的需求、Kafk
    (kafka系列一)转自《Kafka并不难学!入门、进阶、商业实战》一、消息队列1.消息队列的来源在高并发的应用场景中,由于来不及同步处理请求,接收到的请求往往会发生阻塞。例如,大量的插入、更新请求同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的......