1.如何通过调整链而不是数据来交换两个相邻的元素?

    // 单向链表Node *p,*afterp;p=beforep->next;afterp=p->next;p->next=afterp->next;beforep->next=afterp;afterp->next=p;// 双向链表Node *beforep,*afterp;beforep=p->prev;afterp=p->next;p->next=afterp->next;beforep->next=afterp;afterp->next=p;p->next->prev=p;p->prev=afterp;afterp->prev=beforep;

2.如何求出两个已排序的表L1和L2的交集和并集。

// 交集
template <typename Object>
list<Object> intersection( const list<Object> & L1,
const list<Object> & L2)
{list<Object> intersect;typename list<Object>:: const_iterator iterL1 = L1.begin();typename list<Object>:: const_iterator iterL2 = L2.begin();while(iterL1 != L1.end() && iterL2 != L2.end()){if (*iterL1 == *iterL2){intersect.push_back(*iterL1);iterL1++;iterL2++;}else if (*iterL1 < *iterL2)iterL1++;elseiterL2++;}return intersect;
}
// 并集
// Assumes both input lists are sorted
template <typename Object>
list<Object> listUnion( const list<Object> & L1,
const list<Object> & L2)
{list<Object> result;typename list<Object>:: const_iterator iterL1 = L1.begin();typename list<Object>:: const_iterator iterL2= L2.begin();while(iterL1 != L1.end() && iterL2 != L2.end()){if (*iterL1 == *iterL2){result.push_back(*iterL1);iterL1++;iterL2++;}else if (*iterL1 < *iterL2){result.push_back(*iterL1);iterL1++;}else{result.push_back(*iterL2);iterL2++;}}return result;
}

3.一个有表头结点,没有尾结点,还有一个指向表头结点的指针的单向链表,写一个类包括以下函数:
返回链表的大小,
打印链表,
检测值x是否在链表中,
如果x不在链表中则加入链表,
如果x在链表中则删除它。

template <typename Object>
struct Node
{Object data;Node *next;Node (const Object & d = Object(),Node *n=NULL):data(d),next(n){}
};template <typename Object>
class singleList
{public:singleList(){init();}~singleList(){eraseList(head);}singleList(const singleList & rhs){eraseList(head);init();*this=rhs;}bool add(Object x){if(contains(x)){return false;}else{Node<Object> *ptr =new Node<Object>(x);ptr->next=head->next;head->next=ptr;theSize++;}return true;}bool remove(Object x){if(!contains(x))return false;else {Node<Object>*ptr=head->next;Node<Object>*trailer;while(ptr->data!=x){trailer=ptr;ptr=ptr->next;}trailer->next=ptr->next;delete ptr;theSize--;}return true;}int size(){return theSize;}void print(){Node<Object> *ptr=head->next;while(ptr!=NULL){count<<ptr->data<<" ";ptr=ptr->next;}count<<endl;}bool contains(const Object & x){Node<Object> * ptr=head->next;while(ptr!=NULL){if(x==ptr->data)return true;else ptr=ptr->next;}return false;}void init(){theSize=0;head=new Node<Object>;head->next=NULL;}void eraseList(Node<Object> * h){Node<Object> *ptr=h;Node<Object> *nextPtr;while(ptr!=NULL){nextPtr=ptr->next;delete ptr;ptr=nextPtr;}}private:Node<Object> *head;int theSize;
};

4.如何给List迭代器类添加对operator–的支持。

const_iterator & operator-- ()
{current=current->prev;return *this;
}const_iterator operator-- (int)
{const_iterator old=*this;--(*this);return old;
}

5.前面谈到过的双端队列(deque),给它添加以下功能:

函数 备注
push(x) 将项x插入到双端队列的前段
pop() 从双端队列删除前段项并返回
inject(x) 将项x插入到双端队列的尾端
eject() 从双端队列中删除尾端项并将其返回
template <typename Object>
class deque
{
public:deque(){ l();}void push (Object obj) {l.push_front(obj);}Object pop () {Object obj=l.front();pop_front();return obj;}void inject (Object obj) {l.push_back(obj);}Object eject() {pop_back(obj);}
private:list<Object> l;
}

6.不包含表头结点和尾结点,用单向链表高效地实现栈类。

template<typename Object>
struct node
{node() {next=NULL;}node(Object obj):data(obj){}node(Object obj,node * ptr):data(obj),next(ptr){}Object data;node *next;
};template<typename Object>
class stack
{
public:stack(){head=NULL;}~stack(){while(head) pop();}void push(Object obj){node<object> *ptr=new node<Object>(obj,head);head=ptr;}Object top(){return (head->data);}void pop(){node<Object> *ptr=head->next;delete head;head=ptr;}
private:node<Object> *head;
}

7.不包含表头结点和尾结点,用单向链表高效地实现队列类。

template<typename Object>
class queue
{
public:queue(){front=NULL;rear=NULL;}~queue(){while(front)deque();}void deque(Object obj){node<Object> *ptr=new node<Object>(obj,NULL);if(rear)rear=rear->next=ptr;elsefront=rear=ptr;}Object deque(){Object temp=front->data;node<Object> *ptr=front;if(front->next==NULL)front=rear=NULL;elsefront=front->next;delete ptr;return temp;}
private:node<Object> *front;node<Object> *rear;
}

8.使用由vector作为基本的数据结构的循环数组高效地实现队列类。

template<typename Object>
class queue
{
public:queue(int s):maxSize(s),front(0),rear(0){elements.resize(maxSize);}queue(){maxSize=100;front=0;rear=0;elements.resize(maxSize);}~queue(){while(front!=rear) deque();}void enque(Object obj){if(!full()){elements[rear]=obj;rear=(rear+1)%maxSize;}}Object deque(){Object temp;if(!empty()){temp=elements[front];front=(front+1)%maxSize;return temp;}}bool empty(){return front==rear;}bool full(){return (rear+1)%maxSize==front;}
private:int front,rear;int maxSize;vector<Object> elements;
}

欢迎大家点击左上角的“关注”或右上角的“收藏”方便以后阅读。


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp

转载于:https://www.cnblogs.com/NoMasp/p/4495381.html

关于表、栈、队列的几种操作相关推荐

  1. c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc

    数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...

  2. 有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...

    作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...

  3. 1、顺序存储:线性表/栈/队列:理论+C语言实现--详细

    文章目录 Data_Structure 绪论 1.逻辑结构 1.集合结构 2. 线性结构 3.树形结构 4.图形结构 2.物理结构 1.顺序存储结构 2.链式存储结构 1 线性表的顺序存储 1.1 线 ...

  4. 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 链表 + 栈 + 队列 部分!

    链表 链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,也适合考察写代码的能力.链表的操作也离不开指针,指针又很容易导致出错. 综合多方面的原因,链 ...

  5. 顺序队和循环队列,队列篇(顺序队和循环队列入队出队操作)

    数据结构专升本学习,队列篇(顺序队和循环队列) 前言: 之前我们把栈学完了,比较简单,今天我们学习队列里面的顺序队和循环队列,说难不难,说简单不简单,我们需要认真学习,博主会尽力把原理和逻辑讲明白,不 ...

  6. Python队列|一文看懂python队列的几种类型

    前言 队列可以说是"保存数据的容器". 首先输入的数据将被首先删除,因此队列也称为"先进先出"(FIFO). 队列有两个前端. 这些项目是从后面输入的,并且是从 ...

  7. 【数据结构与算法】之栈与队列的应用和操作

    栈 一.概念 栈(stack)又名堆栈,它是一种运算受限的线性表: 限定仅在表尾进行插入和删除操作的线性表.允许插入和删除的一端为栈顶,另一端是栈底. 向一个栈插入新元素又称作进栈.入栈或压栈,它是把 ...

  8. 常见数据结构-栈-队列-数组-链表-哈希表

    数据结构   数据结构是计算机存储.组织数据的方式.是指相互之间存在一种或多种特定关系的数据元素的集合   通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率 持续更新,学一个记一个- 栈 ...

  9. (图解)循环队列的三种判断队空、队满操作(附带源码和插入删除操作等一些基本操作)

    目录 一.普通的顺序存储队列 二.循环队列 (1)少用一个元素空间 i.初始化队列操作: iii.入队操作: iv.出队操作: (2)设置flag标志 i.初始化队列操作: ii.判断队空操作: ii ...

最新文章

  1. jdk1.4容器类关系图
  2. DataBinder.Eval()方法绑定数据
  3. SQL:使用 CASE
  4. [洛谷P1074] 靶形数独
  5. 3.27模拟赛 sutoringu(后缀数组)
  6. 自定义 View 循环滚动刻度控件
  7. 视频操作_01视频读写:视频读写+读取视频+保存视频
  8. 【JAVA 第三章 流程控制语句】课后习题 键入日期输入星期几
  9. 转: SQL Server Analysis Service中Cube的结构
  10. Python 获取 网卡 MAC 地址
  11. android广告平台哪个好用,最新!59个信息流广告平台数据榜单!
  12. 数字电路与系统(第三版)答案 戚金清 王兢
  13. 新 IT 框架概述和双态 IT
  14. KU-600变电站综合自动化系统
  15. QT5.12.1 ARM开发环境搭建 并 移植到RK3399 ubuntu16.04系统运行【完整版】
  16. python设置散点图点的大小_matplotlib - pyplot散点图标记大小
  17. 有关积分的不等式证明
  18. 【Python标准库】base64模块
  19. svn服务器端下载linux,Svn linux服务端安装及配置
  20. 3D激光SLAM:LeGO-LOAM论文解读---激光雷达里程计与建图

热门文章

  1. solaris系统中的’format’程序
  2. 每周一个设计模式之工厂方法与抽象工厂
  3. Sophos 修复 Cyberoam OS 中的 SQL 注入漏洞
  4. 利用思科 Webex中的3个漏洞,以 ghost 用户身份参会
  5. 苹果全面开放漏洞奖励计划:最高100万美元等你拿
  6. CentOS 7.5安装部署Jewel版本Ceph集群
  7. 1038 一元三次方程求解
  8. OpenStack_Swift源代码分析——Ring基本原理及一致性Hash算法
  9. 环形二维数组求最大子矩阵
  10. flash 定义主舞台窗口大小