线性表、栈和队列

一、线性表(list)

1、定义:有序、有限的数据序列,其中的每个数据称为元素(element)。

  注:在这里本文中所指的元素的数据类型相同。

2、基本概念:空(empty)、长度(length)、头(head)、尾(tail)、有序表(sorted list)、无序表(unsorted list)

3、基本操作:初始化、插入、删除、访问、修改

4、用抽象类(Abstract Base Class)表示:

template <typename E>
class List
{
private:
    void operator = (const List & ){}
    List(const List &){}
public:
    List(){}
    virtual ~List(){}
    virtual clear() =0;
    virtual void insert(const E & iteam) = 0;
    virtual append(const E& iteam)=0;
    virtual E remove()=0;
    virtual void moveToStart()=0;
    virtual viod moveToEnd()=0;
    virtual void prev()=0;//向左移动
    virtual void next()=0;
    virtual int length()const =0;
    virtual int currPos()const =0;
    virtual void moveToPos()=0;
    virtual const E& getValue()const =0;
};

5、线性表的实现

  (1)数组表

template<typename E>
class AList : public List<E>
{
private:
    int maxSize;
    int listSize;
    int curr;
    E * listArray;
public:
    Alist(int size=defaultSize)
    {
        maxSize = size;
        listSize=curr=0;
        listArray=new [maxSize];
    }
    ~AList()
    {
        delete [] listArray;
    }
    void clear()
    {
        delete [] listArray;
        listSize=curr=0;
        listArray=new E[maxSize];
    }
    void insert(const E& IT)
    {
        Assert(listSize < maxSize,"List capacity exceeded");
        for(int i=listSize;i>curr;i--)
            listArray[i]=listArray[i-1];
        listArray[curr]=it;
        listSize++;
    }
    void append(const E& it)
    {
        Assert(listSize<maxSize,"List capacity exceeded");
        listArray[listSize++]=it;
    }
    E remove()
    {
        Assert((curr>=0)&&(curr<=listSize),"No element");
        E it =listArray[i]=listArray[i+1];
        for(int i=curr;i<listSize;i++)
            listArray[i]=listArray[i++];
        listSize--;
        return it;
        void moveToStart(){curr=0}
        void moveToEnd(){curr=listSize;}
        void prev() {if (curr!=0) curr--;}
        void next() {if(curr<listSize) curr++;}
        int length const {return listSize;}
        int currPos() const {return curr;}
        void moveToPos(int pos)
        {
            Assert((pos>=0)&&(pos<=listSize),"Pos out of range");
            curr=pos;
        }
        const E& getValue() const
        {
            Assert((curr>=0)&&(curr<listSize),"No current element");
            return listArray[curr];
        }
};

(2)链表(linked list)

各个元素分布在内存中不同位置,其中每个元素称为节点(Node),每个节点包括自身的数据和指向下一个元素(节点)的指针(通常命名为next),因此要访问某一个节点只能先访问其上一个节点。也就是说访问其中任意一个节点都需要从头开始。

最后一个节点的指针next需要设置为Null。

template<type E>
class LList:public List
{
private:
    Link<E> * head;
    Link<E> * tail;
    Link<E> * curr;
    int cut;
    void init()
    {
        curr=tail=head=new Lind<E>;
        cnt=0;
    }
    void removeall()
    {
        while(head != NULL){
            curr=head;
            head =head->next;
            delete curr;
        }
    }
public:
    LList(int size=defaultSize){init();}
    ~List(){removeall();}
    void print() const;
    void clear(){removeall();init();}
    void insert(const E& it){
    curr->next=new Link<E>(i}t,NULL);
        cnt++;
    }
    void append(const E& it){
        tail=tail->next;
        cnt++;
    }
    E remove(){
        Assert(curr->next!=Null,"No element");
        E it = curr->net->element;
        Link<E> * ltemp=curr->next;
        if(tail==curr->next+ tail=curr;
            curr->next=curr->next->next;
            delete ltemp;
            cnt--;
            return it;
    }
    void moveToStart(){curr=head;}
    void moveToEnd(){curr=tail;}
    void prev(){
        if(curr==head)return;
        Link<E>* temp=head;
        while(temp->!=curr) temp=temp-next;
        curr=temp;
    }
    void next(){
        if (curr!=tail) curr=curr->next;
    }
    int length()const {return cnt;)
    int currPos()const {
        Link<E>* temp=head;
        int i;
        for(i=0;curr!=temp;i++)
            temp=temp->next;
        return i;
    }
    void moveToPos(int pos){
        Sssert((pos>=0)!&&(pos<=cnt),"Position out of range");
        curr=head;
        for(int i=0;i<pos;i++) curr=curr->next;
    }
    const E& getValue()const {
        Assert(curr->next!=NULL,"No value");
        return curr->next->element;
    }
};

在以上实现中为了方便查入节点,使指针指向所要指向元素的前一个节点。  

时间: 2024-12-29 06:04:06

线性表、栈和队列的相关文章

2 限定性线性表——栈与队列

1 栈与队列     1.1 包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数 在该栈中,调用min.push和pop方法 要求时间复杂度均为O(1) 算法思想: 要求时间复杂度均为 O(1),增加辅助空间实现,即增加一个辅助栈存储min值 例如:data 中依次入栈 5, 4, 3, 8, 10, 11, 12, 1, 则 min 中依次入栈 5, 4, 3,no,no, no, no, 1. no 代表此次不如栈,如果入栈的元素小于等于 min 中的栈

数据结构_线性表_顺序队列_循环队列_链队列

个位看官,由于队列操作相对简单,我啥也不多说,直接上代码,欢迎验证!!! #pragma mark --abstract //队列(queue)是只允许在表的一端进行插入,在表的另一端进行删除的线性表,允许插入的一端称为队尾(rear) //允许删除的一端叫做队头(font),不含元素的队列称为空队列 //队列的特点是先进先出(FIFO线性表) #pragma mark --分类 //1.队列的顺序存储结构称为顺序队列(sequential queue),他是由存放队列的一维数组和分别指向队头和

数据结构和算法学习总结04 线性表---栈

栈 栈(Stack)是特殊的线性表,是只允许在一端进行插入和删除的线性表. 允许插入和删除的叫栈顶,反之则是栈底. 栈的插入称为进栈,删除称为出栈. 特性是:后进先出,所以栈也叫后进先出表,简称LIFO表(Last In First Out). 因为栈是线性表,所以也有顺序表和链表两种形式,一般我们常用顺序表. 从代码中可以看出:与顺序表相比实际上就是插入和删除操作发生了改变. #include <iostream> using namespace std; const int Stack_S

数据结构和算法分析(9)表栈和队列的实际应用(一)

    在接下来的几篇博文中,将介绍表.栈.队列在编程实践中的应用.     (1)表达式求值:     输入一个中缀表达式,操作符包括(+ - * / ^).转化为后缀表达式之后并计算表达式的值: 要求: 1.输入的中缀表达式必须是一个完整的字符串: 2.不限制数字的位数和正负,负数用()括起来: 代码如下: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define EmptyT

数据结构和算法分析(10)表栈和队列的实际应用(二)

    本节继续介绍表.栈.队列在编程实践中的应用.     (1)行编辑程序:(允许用户输入出差错,并在发现错误时可以及时更正.)     功能:接受用户从终端输入的字符型的数据,并存入用户的数据区.由于不能保证不出差错,因此“每接受一个字符即存入用户数据区”的做法不是最恰当的:较好的做法是,设立一个输入的缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区. 算法原理:当用户发现刚刚键入的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效:如果发现当前键入的行内差错较多或者

数据结构-线性表-栈

栈:后进先出(LIFO) last in first out栈是一种特殊的线性表,只能在线性表的一端进行操作.栈顶 top栈底 bottom 实现方式:顺序结构实现,线性结构实现 链式存储实现 LinkStack.h #ifndef _LINKSTACK_H_ #define _LINKSTACK_H_ typedef void LinkStack; LinkStack* LinkStack_Create(); void LinkStack_Destroy(LinkStack* stack);

5 线性表-栈-链式存储

头大-- 栈是一种功能受限的线性表 1.基本功能实现 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<iostream> 4 using namespace std; 5 #define TRUE 1 6 #define FALSE 0 7 #define OK 1 8 #define ERROR 0 9 #define OVERFLOW -2 10 #define STACK_INIT_SIZE 100//存储空

2.线性表——栈

1.什么是栈 [1]. 栈是一种只能在一端进行插入和删除操作的线性表:插入:入栈(push):删除:出栈(pop): [2]. 栈是按照“先进后出”(Last In First Out, LIFO)的原则存储数据: 栈顶(Top):允许删除和插入: 栈底(Botton) : [3]. 栈的分类: 静态栈:其核心是数组,类似于一个连续内存的数组,需要提前确定好栈的大小: 动态栈:其核心是链表,内存够用的前提下,可以无穷大,不连续: [4]. 栈的表示: 1.1 栈的表示 2. 栈的基本操作 [1]

数据结构和算法-数据结构-线性结构-栈和队列

 ################################################## """ 三.线性结构 (1)栈 1.定义:栈是一个数据集合,可以理解为只能在一端进行插入或者删除操作的列表. 2.栈的特点:后进先出(last-in,first-out),简称LTFO表 这种数据结构的特点: 就是像是杯子或者是弹夹,电梯, 存储的时候从底部开始,读取的时候从顶部开始,具备这种特点就是栈 就是后进先出, 存储的时候就可以从顺序表或者链表就可以实现, 只让从一

线性表——栈

package Algorithm; /**  * 栈   * 1.先进后出  * 2.对插入/删除操作的"限定",只能在表的一端进行插入删除操作  * 3.遍历数据速度不同,最先放入最后取出,遍历数据需要开辟临时空间  */ public class MyStack { private Object[] data; private int size; private int top; public MyStack() { super(); this.data = new Object