9勉强能用
This commit is contained in:
parent
ebbf118aa2
commit
7f83a91eba
9 changed files with 580 additions and 0 deletions
110
ex9/BST.hpp
Normal file
110
ex9/BST.hpp
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
#include "bintree.hpp"
|
||||||
|
#include "stack.hpp"
|
||||||
|
#include <time.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class BST : binTree<int>
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
binNodeArray(int) p;
|
||||||
|
|
||||||
|
public:
|
||||||
|
BST(int num)
|
||||||
|
{
|
||||||
|
srand(time(NULL));
|
||||||
|
int temp = rand() % 1440;
|
||||||
|
_root->data = temp;
|
||||||
|
_root->pos = "root";
|
||||||
|
std::cout << _root->pos;
|
||||||
|
printf("-%02d:%02d \n", temp / 60, temp % 60);
|
||||||
|
|
||||||
|
for (int i = 0; i < num - 1; i++)
|
||||||
|
{
|
||||||
|
temp = rand() % 1440;
|
||||||
|
p = root();
|
||||||
|
std::string position;
|
||||||
|
while (temp != -1)
|
||||||
|
{
|
||||||
|
if (temp < (p->data))
|
||||||
|
{
|
||||||
|
if (hasLC(p))
|
||||||
|
{
|
||||||
|
p = p->lc;
|
||||||
|
position.append("0");
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
position.append("0");
|
||||||
|
addLC(p, temp);
|
||||||
|
p->lc->pos = position;
|
||||||
|
std::cout << position;
|
||||||
|
printf("-%02d:%02d \n", temp / 60, temp % 60);
|
||||||
|
temp = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (temp > (p->data))
|
||||||
|
{
|
||||||
|
if (hasRC(p))
|
||||||
|
{
|
||||||
|
p = p->rc;
|
||||||
|
position.append("1");
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
position.append("1");
|
||||||
|
addRC(p, temp);
|
||||||
|
p->rc->pos = position;
|
||||||
|
std::cout << position;
|
||||||
|
printf("-%02d:%02d \n", temp / 60, temp % 60);
|
||||||
|
temp = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i--;
|
||||||
|
temp = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void trav_level()
|
||||||
|
{
|
||||||
|
Queue<binNodeArray(int)> q;
|
||||||
|
q.enqueue(root());
|
||||||
|
while (!q.empty())
|
||||||
|
{
|
||||||
|
|
||||||
|
binNodeArray(int) node = q.dequeue();
|
||||||
|
std::cout << node->pos;
|
||||||
|
printf("-%02d:%02d \n", node->data / 60, node->data % 60);
|
||||||
|
|
||||||
|
if (hasLC(node))
|
||||||
|
q.enqueue(node->lc);
|
||||||
|
if (hasRC(node))
|
||||||
|
q.enqueue(node->rc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool searchPath(binNodeArray(int) root, binNodeArray(int) target, Stack<binNodeArray(int)> *s)
|
||||||
|
{
|
||||||
|
if (root == NULL)
|
||||||
|
return false;
|
||||||
|
s->push(root);
|
||||||
|
if (root->data == target->data)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
bool flag = false;
|
||||||
|
//先去左子树找
|
||||||
|
if (root->lc != NULL)
|
||||||
|
flag = searchPath(root->lc, target, s);
|
||||||
|
//左子树找不到并且右子树不为空的情况下才去找
|
||||||
|
if (!flag && root->rc != NULL)
|
||||||
|
flag = searchPath(root->rc, target, s);
|
||||||
|
//左右都找不到,弹出栈顶元素
|
||||||
|
if (!flag)
|
||||||
|
s->pop();
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
};
|
47
ex9/binnode.hpp
Normal file
47
ex9/binnode.hpp
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#ifndef _binnode_hpp_
|
||||||
|
#define _binnode_hpp_
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#define binNodeArray(T) binNode<T> *
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
class binNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
T data;
|
||||||
|
std::string pos;
|
||||||
|
binNode *parent;
|
||||||
|
binNode *lc;
|
||||||
|
binNode *rc;
|
||||||
|
binNode()
|
||||||
|
{
|
||||||
|
parent = NULL;
|
||||||
|
lc = NULL;
|
||||||
|
rc = NULL;
|
||||||
|
}
|
||||||
|
binNode(binNode *p, binNode *l, binNode *r)
|
||||||
|
{
|
||||||
|
parent = p;
|
||||||
|
lc = l;
|
||||||
|
rc = r;
|
||||||
|
}
|
||||||
|
~binNode()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator>(binNode const &bn)
|
||||||
|
{
|
||||||
|
return data > bn.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator<(binNode const &bn)
|
||||||
|
{
|
||||||
|
return data < bn.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(binNode const &bn)
|
||||||
|
{
|
||||||
|
return data == bn.data;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
9
ex9/bintree.h
Normal file
9
ex9/bintree.h
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
//bintree宏定义
|
||||||
|
|
||||||
|
#include "binnode.hpp"
|
||||||
|
|
||||||
|
#define isRoot(x) (!(x->parent))
|
||||||
|
#define isLC(x) (!isRoot(x)&&((x)==(x->parent->lc))
|
||||||
|
#define isRC(x) (!isRoot(x)&&((x)==(x->parent->rc))
|
||||||
|
#define hasLC(x) (x->lc)
|
||||||
|
#define hasRC(x) (x->rc)
|
51
ex9/bintree.hpp
Normal file
51
ex9/bintree.hpp
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#ifndef _bintree_hpp_
|
||||||
|
#define _bintree_hpp_
|
||||||
|
#include "binnode.hpp"
|
||||||
|
#include "list.hpp"
|
||||||
|
#include "queue.hpp"
|
||||||
|
template <class T>
|
||||||
|
class binTree
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
binNodeArray(T) _root;
|
||||||
|
List<T> plist;
|
||||||
|
int height;
|
||||||
|
|
||||||
|
public:
|
||||||
|
binNodeArray(T) root()
|
||||||
|
{
|
||||||
|
return _root;
|
||||||
|
}
|
||||||
|
binTree()
|
||||||
|
{
|
||||||
|
_root = new binNode<T>;
|
||||||
|
}
|
||||||
|
|
||||||
|
binNodeArray(T) addLC(binNodeArray(T) node,T data)
|
||||||
|
{ if(node->lc)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
binNodeArray(T) temp = new binNode<T>;
|
||||||
|
temp->data = data;
|
||||||
|
node->lc = temp;
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
binNodeArray(T) addRC(binNodeArray(T) node,T data)
|
||||||
|
{ if(node->rc)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
binNodeArray(T) temp = new binNode<T>;
|
||||||
|
temp->data = data;
|
||||||
|
node->rc = temp;
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
void trav_level()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "bintree.h"
|
12
ex9/ex9.cpp
Normal file
12
ex9/ex9.cpp
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include "BST.hpp"
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
printf("初始化\n");
|
||||||
|
BST bst(31);
|
||||||
|
printf("层次遍历\n");
|
||||||
|
bst.trav_level();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
123
ex9/list.hpp
Normal file
123
ex9/list.hpp
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
#ifndef _LIST_HPP_
|
||||||
|
#define _LIST_HPP_
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#define listNode ln *
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
class List
|
||||||
|
{
|
||||||
|
typedef struct ln
|
||||||
|
{
|
||||||
|
T data;
|
||||||
|
listNode pred;
|
||||||
|
listNode succ;
|
||||||
|
} ln;
|
||||||
|
|
||||||
|
private:
|
||||||
|
listNode header = new ln;
|
||||||
|
listNode trailer = new ln;
|
||||||
|
int _size;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
listNode firstInsertN(listNode New);
|
||||||
|
listNode lastInsertN(listNode New);
|
||||||
|
listNode succInsertN(listNode old, listNode ne);
|
||||||
|
listNode predInsertN(listNode old, listNode ne);
|
||||||
|
void removeN(listNode i);
|
||||||
|
listNode searchN(int value, int n, listNode p);
|
||||||
|
|
||||||
|
public:
|
||||||
|
int size(){return _size;}
|
||||||
|
List();
|
||||||
|
void clear();
|
||||||
|
listNode first() { return header->succ; }
|
||||||
|
listNode last() { return trailer->pred; }
|
||||||
|
T firstInsert(T New);
|
||||||
|
T lastInsert(T New);
|
||||||
|
T removeLast();
|
||||||
|
listNode succInsert(listNode Old, T New);
|
||||||
|
listNode predInsert(listNode Old, T New);
|
||||||
|
|
||||||
|
int get(int i);
|
||||||
|
listNode find(int i);
|
||||||
|
|
||||||
|
T operator[](int i)
|
||||||
|
{
|
||||||
|
listNode p = first();
|
||||||
|
while (0 < i--)
|
||||||
|
p = p->succ;
|
||||||
|
return p->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
T remove(listNode p);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
List<T>::List()
|
||||||
|
{
|
||||||
|
_size = 0;
|
||||||
|
header->data = 0;
|
||||||
|
header->succ = trailer;
|
||||||
|
header->pred = NULL;
|
||||||
|
|
||||||
|
trailer->data = 0;
|
||||||
|
trailer->succ = NULL;
|
||||||
|
trailer->pred = header;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void List<T>::clear()
|
||||||
|
{
|
||||||
|
while (0 < _size)
|
||||||
|
remove(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
T List<T>::firstInsert(T New)
|
||||||
|
{
|
||||||
|
listNode temp = new ln;
|
||||||
|
temp->data = New;
|
||||||
|
temp->pred = header;
|
||||||
|
temp->succ = header->succ;
|
||||||
|
header->succ = temp;
|
||||||
|
temp->succ->pred = temp;
|
||||||
|
_size++;
|
||||||
|
return New;
|
||||||
|
}
|
||||||
|
template <class T>
|
||||||
|
T List<T>::lastInsert(T New)
|
||||||
|
{
|
||||||
|
listNode temp = new ln;
|
||||||
|
temp->data = New;
|
||||||
|
temp->succ = trailer;
|
||||||
|
temp->pred = trailer->pred;
|
||||||
|
trailer->pred = temp;
|
||||||
|
temp->pred->succ = temp;
|
||||||
|
_size++;
|
||||||
|
return New;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
T List<T>::removeLast()
|
||||||
|
{
|
||||||
|
return remove(trailer->pred);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
T List<T>::remove(listNode p)
|
||||||
|
{
|
||||||
|
if (!_size)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
T temp = p->data;
|
||||||
|
(p->pred)->succ = p->succ;
|
||||||
|
(p->succ)->pred = p->pred;
|
||||||
|
delete[] p;
|
||||||
|
_size--;
|
||||||
|
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
45
ex9/queue.hpp
Normal file
45
ex9/queue.hpp
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
#ifndef _QUEUE_HPP_
|
||||||
|
#define _QUEUE_HPP_
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include "list.hpp"
|
||||||
|
template <class T>
|
||||||
|
class Queue
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
List<T> q;
|
||||||
|
public:
|
||||||
|
|
||||||
|
T operator[](int i)
|
||||||
|
{
|
||||||
|
return q[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
int size()
|
||||||
|
{
|
||||||
|
return q.size();
|
||||||
|
}
|
||||||
|
bool empty()
|
||||||
|
{
|
||||||
|
return size() ? false : true;
|
||||||
|
}
|
||||||
|
T enqueue(T e)
|
||||||
|
{
|
||||||
|
return q.firstInsert(e);
|
||||||
|
}
|
||||||
|
T dequeue()
|
||||||
|
{
|
||||||
|
return q.removeLast();
|
||||||
|
}
|
||||||
|
T front()
|
||||||
|
{
|
||||||
|
return q.last()->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
T back()
|
||||||
|
{
|
||||||
|
return q.first()->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
#endif
|
64
ex9/stack.hpp
Normal file
64
ex9/stack.hpp
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
#ifndef _STACK_HPP_
|
||||||
|
#define _STACK_HPP_
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
class Stack
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
T *_v;
|
||||||
|
int _len = 10;
|
||||||
|
int _used = 0;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Stack()
|
||||||
|
{
|
||||||
|
_v = new T[_len];
|
||||||
|
}
|
||||||
|
|
||||||
|
void push(T const &elem)
|
||||||
|
{
|
||||||
|
_v[_used++] = elem;
|
||||||
|
expand();
|
||||||
|
}
|
||||||
|
|
||||||
|
T pop() { return !_used ? NULL : _v[--_used]; }
|
||||||
|
|
||||||
|
T top() const { return !_used ? NULL : _v[_used - 1]; }
|
||||||
|
|
||||||
|
bool empty() { return _used ? false : true; }
|
||||||
|
|
||||||
|
int depth() { return _used; };
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void expand()
|
||||||
|
{
|
||||||
|
if (((double)_used / (double)_len) <= 0.75)
|
||||||
|
return;
|
||||||
|
_len = _len * 2;
|
||||||
|
T *p = new T[_len];
|
||||||
|
|
||||||
|
for (int i = 0; i <= _used; i++)
|
||||||
|
p[i] = _v[i];
|
||||||
|
|
||||||
|
delete[] _v;
|
||||||
|
_v = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void shrink()
|
||||||
|
{
|
||||||
|
if (((double)_used / (double)_len) >= 0.25)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_len = _len >> 1;
|
||||||
|
T *p = new T[_len];
|
||||||
|
|
||||||
|
for (int i = 0; i <= _used; i++)
|
||||||
|
p[i] = _v[i];
|
||||||
|
|
||||||
|
delete[] _v;
|
||||||
|
_v = p;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
119
ex9/vector.hpp
Normal file
119
ex9/vector.hpp
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
#ifndef _VECTOR_HPP_
|
||||||
|
#define _VECTOR_HPP_
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
class Vector
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
T *_v;
|
||||||
|
int _len;
|
||||||
|
int _used;
|
||||||
|
bool _sorted = false;
|
||||||
|
|
||||||
|
void expand();
|
||||||
|
void shrink();
|
||||||
|
void adjust();
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Vector(int len)
|
||||||
|
{
|
||||||
|
_used = 0;
|
||||||
|
_len = len;
|
||||||
|
_v = new int[_len];
|
||||||
|
}
|
||||||
|
Vector()
|
||||||
|
{
|
||||||
|
_used = 0;
|
||||||
|
_len = 10;
|
||||||
|
_v = new int[_len];
|
||||||
|
}
|
||||||
|
|
||||||
|
T get(int a){return _v[a];}
|
||||||
|
T operator[](int i){return _v[i];}
|
||||||
|
|
||||||
|
//排序搜索,返回秩
|
||||||
|
int search(T value);
|
||||||
|
|
||||||
|
void put(int a, int value);
|
||||||
|
|
||||||
|
void swap(int a, int b);
|
||||||
|
|
||||||
|
int insert(int locate, int value);
|
||||||
|
|
||||||
|
int remove(int locate, int value);
|
||||||
|
|
||||||
|
int remove_sorted(int value);
|
||||||
|
|
||||||
|
int find(int value);
|
||||||
|
|
||||||
|
void bubbleSort();
|
||||||
|
|
||||||
|
void printall();
|
||||||
|
|
||||||
|
int getlen();
|
||||||
|
|
||||||
|
int getused();
|
||||||
|
|
||||||
|
int count(int value);
|
||||||
|
|
||||||
|
void mergeSort(int lo, int hi);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void merge(int lo, int mi, int hi);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void Vector<T>::expand()
|
||||||
|
{
|
||||||
|
_len = _len * 2;
|
||||||
|
T *p = new T[_len];
|
||||||
|
|
||||||
|
for (int i = 0; i <= _used; i++)
|
||||||
|
p[i] = _v[i];
|
||||||
|
|
||||||
|
delete[] _v;
|
||||||
|
_v = p;
|
||||||
|
}
|
||||||
|
template <class T>
|
||||||
|
void Vector<T>::shrink()
|
||||||
|
{
|
||||||
|
_len = _len >> 1;
|
||||||
|
T *p = new T[_len];
|
||||||
|
|
||||||
|
for (int i = 0; i <= _used; i++)
|
||||||
|
p[i] = _v[i];
|
||||||
|
|
||||||
|
delete[] _v;
|
||||||
|
_v = p;
|
||||||
|
}
|
||||||
|
template <class T>
|
||||||
|
void Vector<T>::adjust()
|
||||||
|
{
|
||||||
|
if (((double)_used / (double)_len) < 0.25)
|
||||||
|
shrink();
|
||||||
|
else if (((double)_used / (double)_len) > 0.75)
|
||||||
|
expand();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
int Vector<T>::search(T e)
|
||||||
|
{
|
||||||
|
if (_sorted == false)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for (; i <= _used && _v[i] <= e; i++)
|
||||||
|
;
|
||||||
|
|
||||||
|
return i - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Reference in a new issue