服务器之家

服务器之家 > 正文

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

时间:2021-03-27 15:13     来源/作者:YoferZhang

队列类链式存储

代码:
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;
}
标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部