苏维埃日报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 @ 2024-02-05 08:42  鸣辰君  阅读(4)  评论(0编辑  收藏  举报