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