用数组模拟队列和链表

用数组模拟队列和链表

1.用数组模拟队列

在队尾插入元素,在队头弹出元素
定义方式:
int q[N],hh,tt=-1;//hh是队头,tt是队尾,令tt=-1

插入元素x:(push操作)

q[++tt]=x;

弹出队头元素(pop)

hh++;

取出队头元素

q[hh];

判断队列是否为空

if(hh<=tt) not empty
else empty


理解方式:
的啊啊啊是
当hh++时,即弹出元素,tt++时插入元素。

2.用数组模拟链表

时间复杂度分析:链表在插入的时候可以达到O(1)的复杂度

理解:

初始化:
int h[N],ne[N],e[N],idx;
void init()
{
	head=-1;
	idx=0;
	}
head是链表头,ne表示next的下标,e数组表示内容,idx表示边的数量

//在链表头插入数字a

void insert_head(int a)
{
	e[idx]=a;
	ne[idx]=head;
	head=idx++;
				}

解释:就先把值赋到数据域,然后让head的地址值存入指针域,让idx向下移一位;

//向链表中的k位置插入x

void insert(int k,int x)
{
	e[idx]=x;
	ne[x]=ne[k];
	ne[k]=idx++;	
					}
					

可以把k当成head理解。

//将下标是k的点的后面那个点删除,需要保证头结点的存在

void remove(int k)
{
		ne[k]=ne[ne[k]];
		}
		

题目:ACWING.826

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int head,ne[N],e[N];
int idx;
void init()
{
    head=-1;
    idx=0;
}
void add_head(int x)
{
    e[idx]=x;
    ne[idx]=head;
    head=idx;
    idx++;
}
//将x插到下标是K的后面
void add(int k,int x)
{
    e[idx]=x;
    ne[idx]=ne[k];
    ne[k]=idx;
    idx++;
}
//将下标是K的点的后面的点删掉
void remove(int k)
{
    ne[k]=ne[ne[k]];
}
int main()
{
    int n;
    cin>>n;
    init();
    while(n--)
    {
        int k;int x;
        char op;
        cin>>op;
        if(op=='H')
        {
            cin>>x;
            add_head(x);
        }
        else if(op=='D')
        {
            cin>>k;
           if (k==0) head = ne[head];
            remove(k-1);
        }
        else if(op=='I')
        {
            cin>>k>>x;
            add(k-1,x);
        }
    }
     for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';
     cout<<endl;
     return 0;
}

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页