算法——模拟数据结构一
2020-04-02 18:36
791 查看
//普通队列:int q[10000],h=0,tt=-1; //添加一个元素a:q[++tt]=a //删除末尾元素tt--; //删除队头元素h++ //输出while(tt>=h) //{ // cout << q[tt--] ; //} //普通栈:int stock[100005],t=-1; ////添加一个元素a ////stock[t++]=a; //删除t-- //单链表:优点方便,缺点访问前一个元素需要重新访问一遍 //这种方法本来是邻接表的表示方法也可以表示单链表 //const int N=100005; //int h ,idex,ne ,e //初始化:memset(h,-1,sizeof(h)) //输入一个数a; //ne[idex]=h[a]; //h[a]=idex; //e[idex++]=a; //删除某个节点ne[a]=ne[ne[a]]; // head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点 /*int head, e , ne , idx; 初始化 void init() { head = -1; idx = 0; } 在链表头插入一个数a void insert(int a) { e[idx] = a, ne[idx] = head, head = idx++; } 将头结点删除,需要保证头结点存在 void remove() { head = ne[head]; }*/ /*2. 循环队列//注意,回头的时候会把原来的值覆盖掉 hh 表示队头,tt表示队尾的后一个位置 int q , hh = 0, tt = 0; 向队尾插入一个数 q[tt++] = x; if (tt == N) tt = 0; 从队头弹出一个数 hh++; if (hh == N) hh = 0; 队头的值 q[hh]; 判断队列是否为空 if (hh != tt) { }*/
实现一个双链表,双链表初始为空,支持5种操作:
(1) 在最左侧插入一个数;
(2) 在最右侧插入一个数;
(3) 将第k个插入的数删除;
(4) 在第k个插入的数左侧插入一个数;
(5) 在第k个插入的数右侧插入一个数
现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。
注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。
输入格式
第一行包含整数M,表示操作次数。
接下来M行,每行包含一个操作命令,操作命令可能为以下几种:
(1) “L x”,表示在链表的最左端插入数x。
(2) “R x”,表示在链表的最右端插入数x。
(3) “D k”,表示将第k个插入的数删除。
(4) “IL k x”,表示在第k个插入的数左侧插入一个数。
(5) “IR k x”,表示在第k个插入的数右侧插入一个数。
输出格式
共一行,将整个链表从左到右输出。
数据范围
1≤M≤100000
所有操作保证合法。
输入样例:
10
R 7
D 1
L 3
IL 2 10
D 3
IL 2 7
L 8
R 9
IL 4 7
IR 2 2
输出样例:
8 7 7 3 2 9
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1e5+10; //e[]表示节点的值,l 表示节点的左指针,r 表示节点的右指针,idx表示当前用到的哪个节点 int l[N],r[N],e[N],idx; //初始化 void init() { //0是左端点,1是右端点 l[0]=0; r[0]=1; idx=2; } //在节点a的右边插入一个数x void insert(int a,int x) { e[idx]=x; r[idx] = r[a],l[idx] = a; l[r[a]] = idx, r[a] = idx ++ ; } //删除节点a void remove(int a) { l[r[a]]=l[a]; r[l[a]]=r[a]; } int main() { int m; cin>>m; init(); while(m--) { string op; cin>>op; int k,x; if(op=="L") { cin>>x; insert(0,x); } else if(op=="R") { cin>>x; insert(l[1],x); } else if(op=="D") { cin>>k; remove(k+1); } else if(op=="IL") { cin>>k>>x; insert(l[k+1],x); } else { cin>>k>>x; insert(k+1,x); } } for(int i=r[0];i!=1;i=r[i]) { cout<<e[i]<<' '; } cout<<endl; return 0; }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 数据结构之堆栈模拟应用(算法3.1)
- 【数据结构与算法C】利用两个栈S1S2模拟一个队列,用栈的基本操作实线EnQueue,DeQueue,QueueEmpty
- 数据结构与算法C++描述(5)---模拟指针及模拟链表
- 数据结构与算法 JavaScript实现 —— 队列(模拟发票,按票价排队)
- 数据结构实践——置换-选择算法模拟
- C++队列模拟银行排队叫号(加州大学伯克利分校计算机专业数据结构与算法作业)
- 数据结构实践——置换-选择算法模拟
- PTA 数据结构与算法 7-22 堆栈模拟队列
- 数据结构与算法问题 快速排序
- 算法:经典数据结构题
- 算法学习之数据结构之二叉查找树
- 数据结构与算法之大数据处理
- 1.[数据结构和算法分析笔记]数组
- 数据结构与算法------二分查找
- 数据结构——算法之(018)( 和为n连续正数序列)
- 数据结构与算法 —— 动态数组
- 数据结构——算法之(027)( 在O(1)时间内删除链表结点)
- 线性表5 – 数据结构和算法10
- 1.Python数据结构及算法----栈
- 数据结构与算法-栈