服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++中实现队列类链式存储与栈类链式存储的代码示例

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

2021-03-27 15:13YoferZhang C/C++

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

队列类链式存储

代码:
linkqueue.hpp 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// 队列类
 
#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 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// 队列类测试程序
 
#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 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// 栈类
 
#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 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// 链式存储栈类的测试程序
 
#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 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// 链表类
 
#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;
}

延伸 · 阅读

精彩推荐