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

队列类链式存储

代码:
linkqueue.hpp 

// 队列类 

#pragma once 

#include "linklist.hpp" 

template <typename T>
class LinkQueue
{
public:
  LinkQueue();
  ~LinkQueue();
public:
  int clear();
  int append(T &t);
  int retieve(T &t);
  int header(T &t);
  int length();
protected:
  LinkList<T> *m_list;
}; 

template <typename T>
LinkQueue<T>::LinkQueue()
{
  m_list = new LinkList < T > ;
} 

template <typename T>
LinkQueue<T>::~LinkQueue()
{
  clear();
  delete m_list;
  m_list = NULL;
} 

template <typename T>
int LinkQueue<T>::clear()
{
  T t;
  while (m_list->getLen() > 0) {
    m_list->del(0, t);
  }
  return 0;
} 

template <typename T>
int LinkQueue<T>::append(T &t)
{
  return m_list->insert(t, m_list->getLen());
} 

template <typename T>
int LinkQueue<T>::retieve(T &t)
{
  return m_list->del(m_list->getLen() - 1, t);
} 

template <typename T>
int LinkQueue<T>::header(T &t)
{
  return m_list->get(0, t);
} 

template <typename T>
int LinkQueue<T>::length()
{
  return m_list->getLen();
}

main.cpp 

// 队列类测试程序 

#include <iostream>
#include <cstdio>
#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<Student> lq; // 创建队列
  lq.append(s1); // 入队列
  lq.append(s2);
  lq.append(s3); 

  Student tmp;
  lq.header(tmp);
  cout << "header of queue: " << tmp.age << endl;
  cout << "length of queue: " << lq.length() << endl; 

  while (lq.length() > 0) {
    lq.retieve(tmp);
    cout << tmp.age << " ";
  }
  cout << endl; 

  lq.clear(); 

} 

int main()
{
  play(); 

  return 0;
}

栈类链式存储

linkstack.hpp 

// 栈类 

#pragma once 

#include "linklist.hpp" 

template <typename T>
class LinkStack
{
public:
  LinkStack();
  ~LinkStack();
public:
  int clear();
  int push(T &t);
  int pop(T &t);
  int top(T &t);
  int size();
protected:
  LinkList<T> *m_list;
}; 

template <typename T>
LinkStack<T>::LinkStack()
{
  m_list = new LinkList < T > ;
} 

template <typename T>
LinkStack<T>::~LinkStack()
{
  clear();
  delete m_list;
  m_list = NULL;
} 

template <typename T>
int LinkStack<T>::clear()
{
  T t;
  while (m_list->getLen() > 0) {
    m_list->del(0, t);
  } 

  return 0;
} 

template <typename T>
int LinkStack<T>::push(T &t)
{
  return m_list->insert(t, 0);
} 

template <typename T>
int LinkStack<T>::pop(T &t)
{
  return m_list->del(0, t);
} 

template <typename T>
int LinkStack<T>::top(T &t)
{
  return m_list->get(0, t);
} 

template <typename T>
int LinkStack<T>::size()
{
  return m_list->getLen();
}

main.cpp 

// 链式存储栈类的测试程序 

#include <iostream>
#include <cstdio>
#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<Student> ls; // 创建栈 

  // 入栈
  ls.push(s1);
  ls.push(s2);
  ls.push(s3); 

  // 获取栈顶元素
  Student tmp;
  ls.top(tmp);
  cout << "top of stack: " << tmp.age << endl;
  cout << "size of stack: " << ls.size() << endl; 

  // 出栈
  while (ls.size() > 0) {
    ls.pop(tmp);
  } 

  ls.clear(); 

} 

int main()
{
  play(); 

  return 0;
}

linklist.h 

// 链表类 

#pragma once 

#include <iostream>
#include <cstdio>
using namespace std; 

template <typename T>
struct Node
{
  T t;
  Node<T> *next;
}; 

template <typename T>
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<T> *header;
  int length;
}; 

template <typename T>
LinkList<T>::LinkList()
{
  header = new Node < T > ;
  header->next = NULL;
  length = 0;
} 

template <typename T>
LinkList<T>::~LinkList()
{
  Node<T> *tmp = NULL; 

  while (header) {
    tmp = header->next;
    delete header;
    header = tmp;
  }
} 

template <typename T>
int LinkList<T>::clear()
{
  ~LinkList();
  LinkList();
  return 0;
} 

template <typename T>
int LinkList<T>::insert(T &t, int pos)
{
  Node<T> *cur = NULL; 

  // 对pos的容错处理
  if (pos >= length) {
    pos = length;
  } 

  cur = header;
  for (int i = 0; i < pos; ++i) {
    cur = cur->next;
  } 

  // 把上层应用的t结点缓存到容器中
  Node<T> *node = new Node < T > ;
  node->next = NULL;
  node->t = t; // 把t缓存到容器中 

  node->next = cur->next;
  cur->next = node; 

  ++length; 

  return 0;
} 

template <typename T>
int LinkList<T>::get(int pos, T &t)
{
  Node<T> *cur = NULL; 

  if (pos >= length) {
    return -1;
  } 

  cur = header;
  for (int i = 0; i < pos; ++i) {
    cur = cur->next;
  } 

  t = cur->next->t; // 把pos位置的结点赋值给t 

  return 0;
} 

template <typename T>
int LinkList<T>::del(int pos, T &t)
{
  Node<T> *cur = NULL; 

  if (pos >= length) {
    return -1;
  } 

  cur = header;
  for (int i = 0; i < pos; ++i) {
    cur = cur->next;
  }
  Node<T> *ret = NULL;
  ret = cur->next;
  t = ret->t; // 把缓存的结点给上层应用t 

  // 删除操作
  cur->next = ret->next;
  --length;
  delete ret; // 注意释放内存,因为insert的时候new Node<T> 

  return 0;
} 

template <typename T>
int LinkList<T>::getLen()
{
  return length;
} 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 栈
, 队列
链式存储
队列的链式存储结构、队列的链式存储、栈的链式存储结构、栈的链式存储、栈和队列的存储方式,以便于您获取更多的相关知识。

时间: 2024-09-01 06:20:59

C++中实现队列类链式存储与栈类链式存储的代码示例_C 语言的相关文章

队列的动态链式存储实现代码分享_C 语言

复制代码 代码如下: #include <stdlib.h>#include <malloc.h>#include <memory.h>#include <assert.h>#include "DynaLnkQueue.h" /*------------------------------------------------------------操作目的: 初始化队列初始条件: 无操作结果: 构造一个空的队列函数参数:  LinkQue

C++中的类模板详解及示例_C 语言

C++中的函数模板 对于类的声明来说,也有同样的问题.有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: 复制代码 代码如下: class Compare_int{ public:  Compare(int a,int b)  {   x=a;   y=b;  }   int max()  {   return (x>y)?x:y;  }  int min()  {   return (x<y)?x:y;  } private:  int x,y;}; 其作用是

简单了解设计模式中的装饰者模式及C++版代码实现_C 语言

由遇到的问题引出的装饰模式 在 OO 设计和开发过程,可能会经常遇到以下的情况:我们需要为一个已经定义好的类添加新的职责(操作),通常的情况我们会给定义一个新类继承自定义好的类,这样会带来一个问题(将在本模式的讨论中给出).通过继承的方式解决这样的情况还带来了系统的复杂性,因为继承的深度会变得很深. 而装饰提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合. 有关这些内容在讨论中进一步阐述.模式选择装饰模式典型的结构图为: 在 结 构 图 中 , ConcreteComponent

探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题_C 语言

一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域.- 程序结束释放4.另外还有一个专门放常量的地方.- 程序结束释放 在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上.在所有函数体外定义的是

C++中关于委派(Delegates)的实现示例_C 语言

 介绍 在 C++ 中通过一个全局函数来绑定到对象的成员函数是很有用的,这个特性也存在于其他语言中,例如 C#的委派.在 C++ 中相当于成员函数指针,但是 并没有提供相应的特性.在这篇文章中,我想提出一个简单的 C++ 委派的实现,是用 C++ 成员函数指针和 C++11 的可变模板(variadic templates),目前这套实现方法仅支持 GNU C++ 4.7.0,在 Windows 下可使用 MinGW. 背景 在我的方法中奖提供一个create_delegate函数,可通过下面两

C语言编程中借助pthreads库进行多线程编程的示例_C 语言

运行之前需要做一些配置: 1.下载PTHREAD的WINDOWS开发包 pthreads-w32-2-4-0-release.exe(任何一个版本均可)    http://sourceware.org/pthreads-win32/ ,解压到一个目录. 2.找到include和lib文件夹,下面分别把它们添加到VC++6.0的头文件路径和静态链接库路径下面:    a).Tools->Options,选择Directory页面,然后在Show directories for:中选择Includ

C++设计模式编程中的观察者模式使用示例_C 语言

概述:最近中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑客户端上,网页上,手机上,iPad上都可以查看到该证券的实时行情,这种情况下我们应该怎么设计我们的软件呢?我们可以这样:小明的所有客户端上都订阅中国证券这个股票,只要股票一有变化,所有的客户端都会被通知到并且被自动更新. 这就是我们的观察者模式,她定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 类图: 可以看出,在这个观察者模式的实现里有

C/C++中获取数组长度的方法示例_C 语言

学过C/C++的人都知道,在C/C++中并没有提供直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取其长度,那么对于其他类型的数组如何获取他们的长度呢? 其中一种方法是使用sizeof(array) / sizeof(array[0]), 在C语言中习惯上在使用时都把它定义成一个宏,比如: #define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));} 而在C++中则可以使用模板

Cocos2d-x中实现弹出对话框示例_C 语言

在游戏中我们经常会看到弹出一个对话框让我们进行选择,今天我们就在cocos2dx中实现这个对话框.对话框说白了也是一个层,当我们点击某一个按钮的时候这个层被加进了当前的场景中,同时场景中的其他的层都是不可点击的,这个时候就涉及到触摸的优先级的一些问题,当然有些时候你也可以根据自己的需要让其他的层也可以点击,但是道理都是一样的,学会了这个其他的按照自己的要求去实现吧.下面我将弹出层单独分装成一个类,供我们调用. /*对话框场景类的头文件*/ #ifndef _POP_SCENE_H_ #defin