苏维埃日报06.栈与队列的最简单实现(?)
前言
当年学数据结构的时候被栈和队列虐傻了
当年真的没搞清这俩的进出顺序
现在回过头来发现,退役了反而有点会了
一个不恰当的比喻
就像核糖体在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; }
代码优化
因为cin
和cout
的速度太慢,导致这个方法的时间复杂度巨大(?)
因此就需要用到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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人