热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

C++中实现队列类链式存储与栈类链式存储的代码示例

这篇文章主要介绍了C++中实现队列类链式存储与栈类链式存储的代码示例,通过注释来说明,直接上代码,简单粗暴XD需要的朋友可以参考下

队列类链式存储

代码:
linkqueue.hpp 

// 队列类 
 
#pragma once 
 
#include "linklist.hpp" 
 
template  
class LinkQueue 
{ 
public: 
  LinkQueue(); 
  ~LinkQueue(); 
public: 
  int clear(); 
  int append(T &t); 
  int retieve(T &t); 
  int header(T &t); 
  int length(); 
protected: 
  LinkList *m_list; 
}; 
 
template  
LinkQueue::LinkQueue() 
{ 
  m_list = new LinkList  ; 
} 
 
template  
LinkQueue::~LinkQueue() 
{ 
  clear(); 
  delete m_list; 
  m_list = NULL; 
} 
 
template  
int LinkQueue::clear() 
{ 
  T t; 
  while (m_list->getLen() > 0) { 
    m_list->del(0, t); 
  } 
  return 0; 
} 
 
template  
int LinkQueue::append(T &t) 
{ 
  return m_list->insert(t, m_list->getLen()); 
} 
 
template  
int LinkQueue::retieve(T &t) 
{ 
  return m_list->del(m_list->getLen() - 1, t); 
} 
 
template  
int LinkQueue::header(T &t) 
{ 
  return m_list->get(0, t); 
} 
 
template  
int LinkQueue::length() 
{ 
  return m_list->getLen(); 
} 

main.cpp 

// 队列类测试程序 
 
#include  
#include  
#include "linkqueue.hpp" 
 
using namespace std; 
 
struct Student 
{ 
  char name[32]; 
  int age; 
}; 
 
void play() 
{ 
  Student s1, s2, s3; 
  s1.age = 21; 
  s2.age = 22; 
  s3.age = 23; 
 
  LinkQueue lq; // 创建队列 
  lq.append(s1); // 入队列 
  lq.append(s2); 
  lq.append(s3); 
 
  Student tmp; 
  lq.header(tmp); 
  cout <<"header of queue: " < 0) { 
    lq.retieve(tmp); 
    cout <


栈类链式存储

linkstack.hpp 

// 栈类 
 
#pragma once 
 
#include "linklist.hpp" 
 
template  
class LinkStack 
{ 
public: 
  LinkStack(); 
  ~LinkStack(); 
public: 
  int clear(); 
  int push(T &t); 
  int pop(T &t); 
  int top(T &t); 
  int size(); 
protected: 
  LinkList *m_list; 
}; 
 
template  
LinkStack::LinkStack() 
{ 
  m_list = new LinkList  ; 
} 
 
template  
LinkStack::~LinkStack() 
{ 
  clear(); 
  delete m_list; 
  m_list = NULL; 
} 
 
template  
int LinkStack::clear() 
{ 
  T t; 
  while (m_list->getLen() > 0) { 
    m_list->del(0, t); 
  } 
 
  return 0; 
} 
 
template  
int LinkStack::push(T &t) 
{ 
  return m_list->insert(t, 0); 
} 
 
template  
int LinkStack::pop(T &t) 
{ 
  return m_list->del(0, t); 
} 
 
template  
int LinkStack::top(T &t) 
{ 
  return m_list->get(0, t); 
} 
 
template  
int LinkStack::size() 
{ 
  return m_list->getLen(); 
} 

main.cpp 

// 链式存储栈类的测试程序 
 
#include  
#include  
#include "linkstack.hpp" 
 
using namespace std; 
 
struct Student 
{ 
  char name[32]; 
  int age; 
}; 
 
void play() 
{ 
  Student s1, s2, s3; 
  s1.age = 21; 
  s2.age = 22; 
  s3.age = 23; 
 
  LinkStack ls; // 创建栈 
 
  // 入栈 
  ls.push(s1); 
  ls.push(s2); 
  ls.push(s3); 
 
  // 获取栈顶元素 
  Student tmp; 
  ls.top(tmp); 
  cout <<"top of stack: " < 0) { 
    ls.pop(tmp); 
  } 
 
  ls.clear(); 
 
} 
 
int main() 
{ 
  play(); 
 
  return 0; 
} 

linklist.h 

// 链表类 
 
#pragma once 
 
#include  
#include  
using namespace std; 
 
template  
struct Node 
{ 
  T t; 
  Node *next; 
}; 
 
template  
class LinkList 
{ 
public: 
  LinkList(); 
  ~LinkList(); 
 
public: 
  int clear(); 
  int insert(T &t, int pos); 
  int get(int pos, T &t); 
  int del(int pos, T &t); 
  int getLen(); 
 
protected: 
  Node *header; 
  int length; 
}; 
 
template  
LinkList::LinkList() 
{ 
  header = new Node  ; 
  header->next = NULL; 
  length = 0; 
} 
 
template  
LinkList::~LinkList() 
{ 
  Node *tmp = NULL; 
 
  while (header) { 
    tmp = header->next; 
    delete header; 
    header = tmp; 
  } 
} 
 
template  
int LinkList::clear() 
{ 
  ~LinkList(); 
  LinkList(); 
  return 0; 
} 
 
template  
int LinkList::insert(T &t, int pos) 
{ 
  Node *cur = NULL; 
 
  // 对pos的容错处理 
  if (pos >= length) { 
    pos = length; 
  } 
 
  cur = header; 
  for (int i = 0; i next; 
  } 
 
  // 把上层应用的t结点缓存到容器中 
  Node *node = new Node  ; 
  node->next = NULL; 
  node->t = t; // 把t缓存到容器中 
 
  node->next = cur->next; 
  cur->next = node; 
 
  ++length; 
 
  return 0; 
} 
 
template  
int LinkList::get(int pos, T &t) 
{ 
  Node *cur = NULL; 
 
  if (pos >= length) { 
    return -1; 
  } 
 
  cur = header; 
  for (int i = 0; i next; 
  } 
 
  t = cur->next->t; // 把pos位置的结点赋值给t 
 
  return 0; 
} 
 
template  
int LinkList::del(int pos, T &t) 
{ 
  Node *cur = NULL; 
 
  if (pos >= length) { 
    return -1; 
  } 
 
  cur = header; 
  for (int i = 0; i next; 
  } 
  Node *ret = NULL; 
  ret = cur->next; 
  t = ret->t; // 把缓存的结点给上层应用t 
 
  // 删除操作 
  cur->next = ret->next; 
  --length; 
  delete ret; // 注意释放内存,因为insert的时候new Node 
 
  return 0; 
} 
 
template  
int LinkList::getLen() 
{ 
  return length; 
} 


推荐阅读
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • Ralph的Kubernetes进阶之旅:集群架构与对象解析
    本文深入探讨了Kubernetes集群的架构和核心对象,详细介绍了Pod、Service、Volume等基本组件,以及更高层次的抽象如Deployment、StatefulSet等,帮助读者全面理解Kubernetes的工作原理。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文详细探讨了Java中StringBuffer类在不同情况下的扩容规则,包括空参构造、带初始字符串和指定初始容量的构造方法。通过实例代码和理论分析,帮助读者更好地理解StringBuffer的内部工作原理。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文探讨了在Linux系统上使用Docker时,通过volume将主机上的HTML5文件挂载到容器内部指定目录时遇到的403错误,并提供了解决方案和详细的操作步骤。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 本文探讨了在 ASP.NET MVC 5 中实现松耦合组件的方法。通过分离关注点,应用程序的各个组件可以更加独立且易于维护和测试。文中详细介绍了依赖项注入(DI)及其在实现松耦合中的作用。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
author-avatar
mggwvga_84049035
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有