zoukankan      html  css  js  c++  java
  • 数组 链表 栈 队列-笔记/总结

    数组:

    Array类:

    只要类中有一个数据成员为指针时,拥有共性,1. 析构函数 2. 重载运算符 3. 复制构造函数

    栈:

    #include <stdafx.h>
    #include <stdio.h>
    #include <iostream>
    #include <stack>
    using namespace std;
    int main()
    {
        stack<int> st;
        /*
            对栈的操作无非就是:验证是否为空、返回栈中元素数目、对栈顶元素删除、获取以及压入新元素
            st.empty();    验证是否为空
            st.size();    栈中元素个数
            st.pop();        删除栈顶元素,无返回值
            st.push();    将新元素压入栈中
            st.top();        返回栈顶元素
    
            st.size()为st对象调用stack类size函数
            st->size()针对于指针对象指向size函数
        */
        if(st.empty()){
            cout<<"stack is empty"<<endl;        
            cout<<"刚进行初始化stack的大小:  "<<st.size()<<endl;                //输出size
            st.push(111);
            st.push(222);                        //压入栈顶,必须是同类型的int值
            cout<<"push后的stack大小:  "<<st.size()<<endl;
            cout<<"取出stack顶元素:  "<<st.top()<<endl<<endl;
            //取出stack中所有元素
            while(st.size()>0){
                cout<<st.top()<<endl;
                st.pop();
                //因声明的是stack静态对象st,不用考虑内存泄漏
            }
            cout<<"stack size : "<<st.size()<<endl;
        }
        getchar();          //程序暂停等待用户输入任意字符,让命令行窗口不会一闪而过
        return 0;
    }

    链表:

      单链表,双向链表,循环链表。。。。续

    linklist *p;
    p  = (linklist *)p->front;
    p ->next == p -> rear;

    队列:

    #include <stdafx.h>
    #include <stdio.h>
    #include <iostream>
    #include <queue>
    using namespace std;
    int main(){
        queue<int> p;
        /*
        q.empty()               如果队列为空
        q.size()                返回队列中元素的个数  
        q.pop()                 删除队列首元素无返回值
        q.front()               返回队首元素的值,但不删除该元素  
        q.push()                在队尾压入新元素  
        q.back()                返回队列尾元素的值,但不删除该元素  
        */
        if(p.empty()){
            cout<<"pop is empty"<<endl;        
            cout<<"刚进行初始化pop的大小:  "<<p.size()<<endl;                //输出size
            p.push(111);
            p.push(222);                        //压入栈顶,必须是同类型的int值
            cout<<"push后的pop大小:  "<<p.size()<<endl;
            cout<<"取出pop顶元素:  "<<p.front()<<endl<<endl;
            //取出pop中所有元素
            while(p.size()>0){
                cout<<p.front()<<endl;
                p.pop();
                //因声明的是pop静态对象p,不用考虑内存泄漏
            }
            cout<<"pop size : "<<p.size()<<endl;
        }
        getchar();
        return 0;
    }

    栈的数组实现  (利用栈的基本操作来实现对数组的操作)  栈:后进先出  数组:按 (索引->值) 依次存储

    #include <stdafx.h>
    #include <stdio.h>
    #include <malloc.h>
    #define maxsize 10
    typedef struct        //定义结构体,并且在
    {
        int data[maxsize];    //数组大小
        int top;            //栈顶坐标
        int base;        //栈底坐标
    }seqstack;            //seqstack为结构体的别名而已,还可以使用多个别名,且多个别名创建的对象使用的不是同一个内存空间, 并根据数组的结构定义成员
    seqstack * s;            //
    void initstack(seqstack * s)
    {
        s->top = 0;
        s->base = 0;
    }
    int empty(seqstack * s)
    {
        if(s->top == s->base)
            return 1;
        else
            return 0;
    }
    //入栈:赋值 , 索引++
    void  push(seqstack * s, int x)
    {
        if(s->top >= maxsize-1)
        {
            printf("ERROR!
    ");
        }
        else
        {
            s->data[s->top] = x;
            s->top++;
        }
    }
    //获取栈顶元素data[s->top--]  这里需要top--是因为入栈时top索引++了
    void  pop(seqstack * s)
    {
        if(empty(s))
        {
            printf("ERROR!
    ");
        }
        else
        {
            s->top--;
            printf("%d
    ",s->data[s->top]);
        }
    }
    int main()
    {
        seqstack * s;
        //(seqstack *)强转,malloc(size)申请大小为size动态内存空间,sizeof(seqstack),seqstack类型占多少字节sizeof的值就是多大,如:sizeof(int) = 4
        s = (seqstack *)malloc(sizeof(seqstack));
        //此时s为空,s为指针对象,会以传址的方式将s传递给initstack函数
        initstack(s);
        push(s,1);
        push(s,3);
        pop(s);
        push(s,2);
        pop(s);
        pop(s);
        pop(s);
        return 0;
    }

    栈的链表实现        (利用栈的基本操作来实现对链表的操作)

    #include <stdafx.h>
    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    typedef struct node
    {
        int data;
        struct node *next;
    }node,linkstack;                    //使用多个别名,在这里node为节点
    //初始化
    void InitStack(linkstack * top)        
    {
        top->next = NULL;
    }
    //是否为空   只用想想链表的结构就很清楚了,节点与节点之间通过指针关联,只要top->next为NULL即可
    int IsEmpty(linkstack * top)
    {
        if(top->next == NULL) return 1;
        return 0;
    }
    //入栈:新建一个节点赋值,让新节点的next指针指向NUll,栈内top->next指向新节点即可
    int Push(linkstack * top, int x)
    {
        node * p;    
        p = (node *)malloc(sizeof(node));
        if(p == NULL) return 0;
        p->data = x;
        p->next = top->next;            //top->next = null
        top->next = p;
        return 1;
    }
    //删除栈顶元素:
    int Pop(linkstack * top, int *x)
    {
        node * p;
        if(IsEmpty(top))
        {
            printf("ERROE!
    ");
            return 0;
        }
        p = top->next;
        *x = p->data;
        top->next = p->next;
        free(p);
        return 1;
    }
    int main()
    {
        int x;
        linkstack * s;
        s = (linkstack *)malloc(sizeof(linkstack));
        InitStack(s);
        Push(s,1);
        Push(s,3);
        Pop(s,&x);
        printf("%d
    ",x);
        Push(s,2);
        Pop(s,&x);
        printf("%d
    ",x);
        Pop(s,&x);
        printf("%d
    ",x);
        Pop(s,&x);
        return 0;
    }

    队列的数组实现(利用数组的数据结构来对队列进行操作)   先想想数组的实现原理

    原理:

    front           ->            rear           (假设队列顺序从左往右)

    data[front]  ->             data[rear] (如果对队列中front、rear操作,则相应的数据元素、大小也随之变化)

    #include <stdafx.h>
    #include <stdio.h>
    #include <malloc.h>
    #define maxsize 66    //定义变量
    typedef struct      //type define 结构定义
    {
        int data[maxsize];
        int front,rear;   //front来记录列首,rear来记录列尾
    }sequeue;
    sequeue *q;          //循环链表
    void initqueue(sequeue *q)
    {
        q->front = -1;      //q指针指向sequeue对象中的front方法
        q->rear = -1;
    }
    int del(sequeue *q)     
    {
        if(q->front == q->rear)      //列首列尾元素是否相等,若相等则是空的循环队列和数组
            return NULL;
        else
        {
            q->front++;          //->优先级比++大,故先执行->然后++
            return q->data[q->front];  //实现对数组的删除操作,没调用此方法一次就让front记录的值+1  
        }
    }
    int insertqueue(sequeue *q,int x)    //向队列中插入元素,思路:先判断列尾是否超出maxsize大小,然后让索引rear+1,对应的给数组data[rear+1]赋值,来实现插入
    {
        if(q->rear >= maxsize-1)
            return NULL;
        else
        {
            (q->rear)++;            //列尾+1
            q->data[q->rear] = x;
            return 1;
        }
    }
    int empty(sequeue * q)          //简单判断队列是否为空,也就是数组data是否为空
    {
        if(q->front == q->rear)
            return 0;
        else
            return 1;             //这里也可扩展,返回队列元素大小,前提是需要让rear递增
    }
    void print(sequeue * q)          //遍历输出数据元素
    {
        if(q->front == q->rear)
            printf("ERROR!
    ");
        else
        {
            while(empty(q))
            {
                q->front++;
                printf("%d
    ",q->data[q->front]);
            }
        }
    }
    int main()
    {
        int i;
        sequeue *q;
        q  = (sequeue *)malloc(sizeof(sequeue));
        initqueue(q);
        for(i = 0; i < 6; i++)
            insertqueue(q,i);
        printf("front is %d
    
    ",del(q));
        printf("Then the last data is:
    ");
        print(q);
        return 0;
    }

    队列的链表实现  (利用链表的数据结构来实现对队列的操作)  先想想链表的实现原理,要知道链表中某个节点,那就必须要知道它上一个节点

    节点: [值 | 指针] (指向下一个节点的内存地址)

    front           ->            rear           (假设队列顺序从左往右)

    #include <stdafx.h>
    #include <stdio.h>
    #include <malloc.h>
    typedef struct node        //节点
    {
        int data;            //值
        struct node * next;      //指针
    }linklist;             //节点对象             
    typedef struct
    {
        linklist * front, * rear;  //定义结构对象的两个指针,front表示上一个节点,rear表示下一个节点
    }linkqueue;              
    linkqueue * q;           //链表         
    //建立队列
    void initqueue(linkqueue * q)
    {
        q->front = (linkqueue *)malloc(sizeof(linklist));  //动态分配,初始化为0
        q->front->next = NULL;                  //将首节点中指向下一节点的指针置空
        q->rear = q->front;                    //队列首位
    }
    //判断队列空否
    int empty(linkqueue * q)
    {
        if(q->front == q->rear)
            return 1;
        else
            return 0;
    }
    //入队列     先定义一个与listlink相同的节点对象,然后再将它加入链表队列中(rear->next指向新建的节点)
    void inqueue(linkqueue * q, int x)
    {
        q->rear->next = (linklist *)malloc(sizeof(linklist));    //q->rear->next本来是NULL的,现在将对它赋予节点对象,也就连接了rear和rear->next
        q->rear->next->data = x;                    
        q->rear = q->rear->next;                    //让rear没有下一个节点
        q->rear->next = NULL;                       //确定操作的rear节点位于链尾
    }
    //出队列    从front节点开始一节一节的取,此方法每调用一个就取一个,一直取到最后一个时,就会一直返回q->rear
    int outqueue(linkqueue * q)
    {
        linklist * s;
        if(empty(q))
            return NULL;
        else
        {
            s = q->front->next;
            printf("%d
    ",s->data);
            if(s == q->rear)
                q->front = q->rear;
            else
                q->front->next = s->next;
            free(s);
            return 1;
        }
    }
    //main
    int main()
    {
        int i;
        linkqueue * l;
        l = (linkqueue *)malloc(sizeof(linkqueue));
        initqueue(l);
        for(i = 0; i < 10; i++)
            inqueue(l,i);
        for(i = 0; i < 10; i++)
            outqueue(l);
        
        return 0;
    }
  • 相关阅读:
    Trie树详解及其应用
    最长回文字符串_Manacher算法_(O(n))
    设置VisualStudio以管理员身份运行
    wcf使用JetEntityFrameworkProvider.dll写access数据库时,报"操作必须使用一个可更新的查询"错误的解决办法
    data:image字符转byte[]
    ID为XXXX的进程当前未运行
    在Windows2003 server 64位系统上使用ArcEngine开发的WCF服务
    关于position的relative和absolute分别是相对于谁进行定位的
    sql语句进行写数据库时,字符串含有'的处理方式
    EF中关于日期字值的处理
  • 原文地址:https://www.cnblogs.com/xmaomao/p/3288218.html
Copyright © 2011-2022 走看看