数据结构实现

1、链表

#include <iostream>
using namespace std;
class Node{
    public: 
        int data;
        Node* next;
};

class LinkList{
    public:
        int length;
        Node* head;
        
        LinkList();
        ~LinkList();
        void reverse();
        void addFront(int data);
        void add(int data);
        int findk(int k); 
        void print(); 
}; 
LinkList::LinkList()
{
    this->length = 0;
    this->head = NULL;
}
LinkList::~LinkList(){
    std::cout << "LIST DELETED";
}
//头插法 
void LinkList::addFront(int data)
{
    Node* node = new Node();
    node->data = data;
    node->next = this->head;
    this->head = node;
    this->length++;
}
//尾插法 
void LinkList::add(int data)
{
    Node *node = new Node();
    Node *last = head;
    node->data = data;
    node->next = NULL;
    if(head == NULL)
    {
        head = node;
        return;
    }
    while(last->next !=NULL)
    {
        last = last->next;
    }
    last->next = node;
    this->length++;
}
void LinkList::print()
{
    Node* temp = head;
    for(;temp!=NULL;temp = temp->next)
    {
        std::cout<<"data = "<<temp->data<<endl;
    }
}
void LinkList::reverse()
{
    Node *current = head; 
    Node *prev = NULL, *next = NULL; 
    while (current != NULL) 
    { 
        // Store next 
        next = current->next; 

        // Reverse current node's pointer 
        current->next = prev; 

        // Move pointers one position ahead.                                                             
        prev = current; 
        current = next; 
    } 
    head = prev; 
}
int LinkList::findk(int k)
{
    if(k > length)
        throw k;
    Node* p = head;
    Node* q;
    while((k-1)!= 0)
    {
        head = head->next;
        k--;
    }
    q = head;
    while(q->next != NULL)
    {
        q = q->next;
        p = p->next;
    } 
    return p->data;
}
int main(int arg,char* argv[])
{
    try{
        LinkList* l = new LinkList();
        l->add(1);
        l->add(2);
        l->add(3);
        l->add(4);
        l->reverse();
        l->print();
        cout<<"倒数第3个是"<<l->findk(3)<< endl; 
        
        cout<<"length = "<<l->length <<endl;
        delete l;
    }
    catch(int k)
    {
        cout<<"k is illegal!!"<<endl;
    }
    return 0;
}

2、数组

#ifndef ARRAY_H
#define ARRAY_H

#include <cassert>
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
template<class T>
class Array{
    private:
        T* list;//动态分配数组的首地址
        int size;
    public:
        Array(int sz = 50);
        Array(const Array<T> &a);
        ~Array();
        //why return reference when overloading " = "?
//      Array<T>& operator=(const Array<T> &rhs);
        T & operator [] (int i);
        const T & operator [] (int i) const;
//      operator T* ();
//      operator const T* () const;
        int getSize() const;
        void show();
        void delete_same();
//      void resize(int sz);
        
};
template<class T>
Array<T>::Array(int sz)
{
    assert(sz >= 0);
    size = sz;
    list = new T[size];
}
template<class T>
Array<T>::~Array()
{
    delete [] list;
}
template<class T>
Array<T>::Array(const Array<T> &a)
{
//  Array<T> arr = new Array<T>(a.size);
    size = a.size;
    list = new T[size];//apply mem for new object
    //从对象a复制数组元素到本对象
    for(int i = 0;i<size;i++) 
    {
        list[i] = a.list[i];
    }
}
//重载‘= ’
//template<class T>
//Array<T>& Array<T>::operator=(const Array<T> &rhs)
//{
//  
//}
//重载[] 
template<class T>
T & Array<T>:: operator [] (int i)
{
    assert(i >= 0 && i<size);
    return list[i];
}
template<class T>
const T & Array<T>:: operator [] (int i) const
{
    assert(i >= 0 && i<size);
    return list[i];
}
template<class T>
int Array<T>::getSize() const
{
    return size;
}
template<class T>
void Array<T>::show()
{
    int i = 0;
    while(i < size)
    {
        cout<<list[i]<<endl;
        i++;
    }
}
template<class T>
void Array<T>::delete_same()
{
    vector<int> v(size);
    for(int i = 0;i<size;i++)
    {
        v[i] = list[i];
    }
    sort(v.begin(),v.end());
    int j = 0;
    int size_reduce = 0;
    for(int i = 0;i<size - 1;i++)
    {
        if(v[i] != v[i+1])
            list[j++] = v[i];
        else
            size_reduce++;
    }
    list[j] = v[size - 1];
    cout<<"size_reduce = "<<size_reduce<<endl;
    size -= size_reduce;
}
int main()
{
    Array<int> arr(4);
    arr[0] = 8;
    arr[1] = 7;
    arr[2] = 6;
    arr[3] = 6;
    arr.delete_same();
    arr.show();
    cout<<"arr.length = "<<arr.getSize()<<endl;
    return 0;
}
#endif

3、顺序栈

#ifndef STACK_H
#define STACK_H
#include <cassert>
template <class T,int SIZE = 50>
class Stack_{
    private:
        T list[SIZE];
        int top;
    public:
        Stack_();
        void push(const T &item);
        T pop();
        void clear();
        const T &peek() const;
        bool isEmpty() const;
        bool isFull() const;
};
template <class T,int SIZE>
Stack_<T,SIZE>::Stack_():top(-1){
} 

template <class T,int SIZE>
void Stack_<T,SIZE>::push(const T &item)
{
    assert(!isFull());
    list[++top] = item;
}

template <class T,int SIZE>
T Stack_<T,SIZE>::pop()
{
    return list[top--];
} 

template <class T,int SIZE>
const T &Stack_<T,SIZE>::peek() const
{
    assert(!isEmpty());
    return list[top];
}

template <class T,int SIZE>
bool Stack_<T,SIZE>::isEmpty() const{
    return top == -1;
}

template <class T,int SIZE>
bool Stack_<T,SIZE>::isFull() const{
    return top == SIZE -1;
}

template <class T,int SIZE>
void Stack_<T,SIZE>::clear()
{
    top = -1;
}
#endif

4、链栈

#include <iostream>
#include <stdio.h> 
using namespace std;
template<class T>
class Node{
    public: 
        T data;
        Node* next;
        Node(const T &value)
            : next(NULL), data(value)
        {
        } 
};
template<class T,int SIZE = 50>
class LinkStack{
    public:
        Node<T>* top;
        
        LinkStack():top(NULL)
        {
            
        }
        ~LinkStack()
        {
            std::cout << "LIST DELETED";
        }
        void push(const T& data)
        {
            Node<T>* node = new Node<T>(data);
            node->next = this->top;
            this->top = node;
        }
        T pop()
        {
            Node<T> *temp = top;
            top = top->next;
            return temp->data;
        }
        bool isEmpty()
        {
            return top == NULL;
        }
}; 

int main(int arg,char* argv[])
{
    LinkStack<int> l;
    l.push(1);
    l.push(2);
    l.push(3);
    l.push(4);
    cout<<"delete: "<<l.pop()<<endl;
    cout<<"delete: "<<l.pop()<<endl;
    cout<<"delete: "<<l.pop()<<endl;
    cout<<"delete: "<<l.pop()<<endl;
    cout<<l.isEmpty()<<endl;
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容