经典线性数据结构(数组模拟)
1、今天重温了数组模拟的经典线性数据结构,来记录一下。
2、题目如图:
1、单链表:

代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int e[N], ne[N], idx, head;
/* 分别为,value数组,next数组,索引值(当前可用的节点编号),头节点。*/
void init() //初始化
{
idx = 0;
head = -1; //初始无节点,头指针指向-1(空)
}
void add_to_head(int x) //头插节点
{
e[idx] = x;
ne[idx] = head;
head = idx;
idx ++;
}
void add_behind_k(int k, int x)
{
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx ++;
}
void remove_behind_k(int k)
{
ne[k] = ne[ne[k]]; //k的下一个节点变成k的下一个的下一个节点
}
int m;
int main()
{
cin >> m;
init();
while (m -- )
{
char c;
scanf("%s", &c);
if(c == 'H')
{
int x = 0;
scanf("%d", &x);
add_to_head(x);
}
else if(c == 'D')
{
int k = 0;
scanf("%d", &k);
if(k == 0) head = ne[head]; //特判,移除头节点情况
remove_behind_k(k - 1);// !!!注意传入k-1才能删除第k个数
}
else
{
int k = 0, x = 0;
scanf("%d%d", &k, &x);
add_behind_k(k - 1, x); //同样注意k-1。
}
}
for (int i = head; i != -1; i = ne[i] ) printf("%d ",e[i]);
}
2、双链表:

代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int e[N], l[N], r[N], idx;
void init()
{
r[0] = 1;
l[1] = 0;
idx = 2; //0和1已经占用。0为头1为尾
}
void r_insert(int k, int x) //k右插入一个数
{
e[idx] = x;
r[idx] = r[k];
l[idx] = k;
l[r[k]] = idx;
r[k] = idx;
idx ++; // 不要忘记idx更新
}
void delete_k(int k)
{
l[r[k]] = l[k];
r[l[k]] = r[k];
}
int m;
int main()
{
cin >> m;
init(); // !!!!一定要记得初始化!!!!
while (m -- )
{
string c;
cin >> c;
if( c == "L")
{
int x;
scanf("%d", &x);
r_insert(0, x);
}
else if(c =="R")
{
int x;
scanf("%d", &x);
r_insert(l[1], x);
}
else if(c == "D")
{
int k;
scanf("%d", &k);
delete_k(k + 1);
//!!!!因为k是第k个插入的数,k下标 = k + 2 - 1(0,1已经被占用)
}
else if(c == "IL")
{
int k, x;
scanf("%d%d", &k, &x);
r_insert(l[k + 1], x); //k左插即k左点右插
}
else
{
int k, x;
scanf("%d%d", &k, &x);
r_insert(k + 1, x);
}
}
for (int i = r[0]; i != 1; i =r[i] ) printf("%d ", e[i]);
}
3、栈与队列:

代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int stk[N], top;
int m;
int main()
{
cin >>m;
while (m -- )
{
string c;
cin >> c;
if(c == "push")
{
int x;
scanf("%d", &x);
stk[++ top] = x;
}
else if(c == "pop" )
{
int x;
scanf("%d", &x);
top --;
}
else if(c == "empty")
{
if(top == 0) printf("YES\n");
else printf("NO\n");
}
else
{
printf("%d\n",stk[top]);
}
}
}

代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int queue[N], hh, tt = -1;
int m;
int main()
{
cin >>m;
while (m -- )
{
string c;
cin >> c;
if(c == "push")
{
int x;
scanf("%d", &x);
queue[++ tt] = x;
}
else if(c == "pop")
{
hh ++;
}
else if(c == "empty")
{
if(hh>tt) printf("YES\n"); //注意这里,hh=tt的话,是队列还有一个元素
else printf("NO\n");
}
else
{
printf("%d\n", queue[hh]);
}
}
}
3、总结
没什么可说的。。。。。基础数据结构,熟练掌握。
本文来自博客园,作者:Medjay,转载请注明原文链接:https://www.cnblogs.com/Medjay/p/15804087.html

浙公网安备 33010602011771号