栈  0.1
数据结构_第3章
seqList.h
Go to the documentation of this file.
1 
12 #ifndef __seqListIncluded
13 #define __seqListIncluded
14 
15 #include "List.h"
16 #include <iostream>
17 
18 namespace List
19 {
20 // 顺序表类的定义
21 template <typename T>
22 class seqList : public List<T>
23 {
24 private:
25  T *data;
27  int maxSize;
28  void doubleSpace(); // 扩大数组空间
29 public:
31  {
32  public:
33  const_iterator() : current(nullptr) {}
34  virtual const T &operator*() const { return *current; }
36  {
37  ++current;
38  return *this;
39  }
41  {
42  const_iterator old = *this;
43  ++current;
44  return old;
45  }
46  virtual bool operator==(const const_iterator &rhs) const { return rhs.current == current; }
47  virtual bool operator!=(const const_iterator &rhs) const { return rhs.current != current; }
48 
49  protected:
50  T *current;
51 
52  const_iterator(T *p) : current(p) {}
53 
54  friend seqList<T>;
55  };
56 
57  class iterator : public const_iterator
58  {
59  public:
60  virtual T &operator*() { return *iterator::current; }
61  virtual const T &operator*() const { return const_iterator::operator*(); } // 防止被派生类mutator覆盖
62  virtual iterator &operator++()
63  {
65  return *this;
66  }
67 
69  {
70  iterator old = *this;
72  return old;
73  }
74  // 与基类相同
75  // virtual bool operator==(const iterator &rhs) const;
76  // virtual bool operator!=(const iterator &rhs) const;
77  protected:
78  iterator(T *p) : const_iterator(p) {}
79 
80  friend seqList<T>;
81  };
82 
83 public:
84  seqList(int initSize = 10);
85  seqList(const seqList<T> &rhs);
86  seqList(seqList<T> &&rvalue);
87  virtual ~seqList();
88 
89  virtual void clear(); // 删除线性表中所有的元素
90  virtual int length() const; // 返回线性表的长度
91  virtual void insert(int i, const T &obj); // 在第i个位置插入一个元素,即新元素的下标将为i
92  virtual void remove(int i); // 删除第i个位置的元素
93  virtual int search(const T &obj) const; // 返回元素obj在线性表中首次出现的下标
94  virtual T visit(int i) const; // 返回线性表中第i个元素
95  virtual void traverse() const; // 遍历线性表
96 
97  virtual iterator begin() { return iterator(data); } // 数据范围[begin, end)
98  virtual const_iterator begin() const { return iterator(data); }
99  virtual iterator end() { return iterator(data + currentLength); }
100  virtual const_iterator end() const { return iterator(data + currentLength); }
101 };
102 
103 // 顺序表类的实现
104 template <class T>
106 {
107  delete[] data;
108 }
109 
110 template <class T>
112 {
113  currentLength = 0;
114 }
115 
116 template <class T>
118 {
119  return currentLength;
120 }
121 
122 template <class T>
123 T seqList<T>::visit(int i) const
124 {
125  return data[i];
126 }
127 
128 template <class T>
130 {
131  std::cout << '\n';
132  for (int i = 0; i < currentLength; ++i)
133  std::cout << data[i] << ' ';
134 
135  std::cout << std::endl;
136 }
137 
138 template <class T>
139 seqList<T>::seqList(int initSize)
140 {
141  data = new T[maxSize = initSize];
142  currentLength = 0;
143 }
144 
145 template <class T>
147  : data{rvalue.data}, currentLength{rvalue.currentLength}, maxSize{rvalue.maxSize}
148 {
149  rvalue.data = nullptr;
150  rvalue.currentLength = 0;
151  rvalue.maxSize = 0;
152 }
153 
154 template <class T>
156  : data{new T[rhs.maxSize]}, currentLength{rhs.currentLength}, maxSize{rhs.maxSize}
157 {
158  for (int i = 0; i < rhs.maxSize; ++i)
159  data[i] = rhs.data[i];
160 }
161 
162 template <class T>
163 int seqList<T>::search(const T &obj) const
164 {
165  for (int i = 0; i < currentLength; ++i)
166  if (data[i] == obj)
167  return i;
168 
169  return -1;
170 }
171 
172 template <class T>
174 {
175  auto oldData = data;
176  data = new T[maxSize *= 2];
177  for (int i = 0; i < currentLength; ++i)
178  data[i] = oldData[i];
179 
180  delete[] oldData;
181 }
182 
183 template <class T>
184 void seqList<T>::insert(int i, const T &obj)
185 {
186  if (i == currentLength)
187  doubleSpace();
188 
189  for (int k = currentLength++; k > i; --k)
190  data[k] = data[k - 1];
191 
192  data[i] = obj;
193 }
194 
195 template <class T>
197 {
198  --currentLength;
199  for (int k = i; i < currentLength; ++k)
200  data[k] = data[k + 1];
201 }
202 
203 template <class T>
204 seqList<T> operator+(const seqList<T> &A, const seqList<T> &B) // 拼接线性表
205 {
206  seqList<T> C(A.length() + B.length());
207  int i = 0;
208  for (int k = 0; k < A.length(); ++k)
209  C.insert(i++, A.visit(k));
210 
211  for (int k = 0; k < B.length(); ++k)
212  C.insert(i++, B.visit(k));
213 
214  return C;
215 }
216 } // namespace List
217 #endif
List::seqList::const_iterator::operator!=
virtual bool operator!=(const const_iterator &rhs) const
Definition: seqList.h:47
List::seqList::const_iterator::const_iterator
const_iterator(T *p)
Definition: seqList.h:52
List
Definition: dLinkList.h:19
List::seqList::seqList
seqList(int initSize=10)
Definition: seqList.h:139
List::seqList::iterator::operator*
virtual const T & operator*() const
Definition: seqList.h:61
List::seqList::begin
virtual iterator begin()
Definition: seqList.h:97
List.h
栈的抽象类
List::seqList::end
virtual iterator end()
Definition: seqList.h:99
List::seqList::maxSize
int maxSize
Definition: seqList.h:27
List::seqList::traverse
virtual void traverse() const
Definition: seqList.h:129
List::seqList::search
virtual int search(const T &obj) const
Definition: seqList.h:163
List::seqList::remove
virtual void remove(int i)
Definition: seqList.h:196
List::seqList::length
virtual int length() const
Definition: seqList.h:117
List::seqList::begin
virtual const_iterator begin() const
Definition: seqList.h:98
List::seqList::const_iterator
Definition: seqList.h:30
List::seqList::iterator::operator*
virtual T & operator*()
Definition: seqList.h:60
List::seqList::visit
virtual T visit(int i) const
Definition: seqList.h:123
List::seqList::iterator::operator++
iterator operator++(int)
Definition: seqList.h:68
List::seqList::const_iterator::operator==
virtual bool operator==(const const_iterator &rhs) const
Definition: seqList.h:46
List::seqList::data
T * data
Definition: seqList.h:25
List::seqList
Definition: seqList.h:22
List::seqList::const_iterator::const_iterator
const_iterator()
Definition: seqList.h:33
List::seqList::const_iterator::operator++
virtual const_iterator & operator++()
Definition: seqList.h:35
List::seqList::iterator
Definition: seqList.h:57
List::seqList::iterator::iterator
iterator(T *p)
Definition: seqList.h:78
List::seqList::const_iterator::operator++
const_iterator operator++(int)
Definition: seqList.h:40
List::seqList::doubleSpace
void doubleSpace()
Definition: seqList.h:173
List::seqList::currentLength
int currentLength
Definition: seqList.h:26
List::seqList::const_iterator::operator*
virtual const T & operator*() const
Definition: seqList.h:34
List::seqList::const_iterator::current
T * current
Definition: seqList.h:50
List::operator+
dLinkList< T > operator+(const dLinkList< T > &A, const dLinkList< T > &B)
Definition: dLinkList.h:151
List::seqList::~seqList
virtual ~seqList()
Definition: seqList.h:105
List::seqList::clear
virtual void clear()
Definition: seqList.h:111
List::seqList::insert
virtual void insert(int i, const T &obj)
Definition: seqList.h:184
List::seqList::iterator::operator++
virtual iterator & operator++()
Definition: seqList.h:62
List::seqList::end
virtual const_iterator end() const
Definition: seqList.h:100