苏维埃日报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;
}

代码优化

因为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;
}
posted @   鸣辰君  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示