• 基础数据结构(栈,队列)


    栈和队列都是最基础的数据结构,栈的思想是“先进后出”,队列的思想是“先进先出”。怎么说呢,栈和队列其实都是对于单链表或者数组的一些特殊操作。在后边很多算法中经常用到(比如BFS, SPFA。。。)

    栈主要操作有:

    入栈Push;

    取栈顶Get_Top;

    出栈(删除栈顶元素)Pop;

    栈的数组实现(代码非常简单,关键是思想):

    //数组实现
    #include <stdio.h>
    #include <malloc.h>
    #define maxsize 10
    typedef struct
    {
        int data[maxsize];
        int top;
        int base;
    }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!\n");
        }
        else
        {
            s->data[s->top] = x;
            s->top++;
        }
    }
    void  pop(seqstack * s)
    {
        if(empty(s))
        {
            printf("ERROR!\n");
        }
        else
        {
            s->top--;
            printf("%d\n",s->data[s->top]);
        }
    }
    int main()
    {
        seqstack * s;
        s = (seqstack *)malloc(sizeof(seqstack));
        
        initstack(s);
        push(s,1);
        push(s,3);
        pop(s);
        push(s,2);
        pop(s);
        pop(s);
        pop(s);
        return 0;
    }

    单链表实现:

    //链式
    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    typedef struct node
    {
        int data;
        struct node *next;
    }node,linkstack;
    void InitStack(linkstack * top)
    {
        top->next = NULL;
    }
    int IsEmpty(linkstack * top)
    {
        if(top->next == NULL) return 1;
        return 0;
    }
    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 = p;
        return 1;
    }
    int Pop(linkstack * top, int *x)
    {
        node * p;
        if(IsEmpty(top))
        {
            printf("ERROE!\n");
            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\n",x);
        Push(s,2);
        Pop(s,&x);
        printf("%d\n",x);
        Pop(s,&x);
        printf("%d\n",x);
        Pop(s,&x);
        return 0;
    }

    队列的操作与栈类似,这里不赘述了,且看代码实现:

    //数组实现
    #include <stdio.h>
    #include <malloc.h>
    #define maxsize 66
    typedef struct
    {
        int data[maxsize];
        int front,rear;
    }sequeue;
    sequeue * q;
    void initqueue(sequeue *q)
    {
        q->front = -1;
        q->rear = -1;
    }
    int del(sequeue *q)
    {
        if(q->front == q->rear)
            return NULL;
        else
        {
            q->front++;
            return q->data[q->front];
        }
    }
    int insertqueue(sequeue *q,int x)
    {
        if(q->rear >= maxsize-1)
            return NULL;
        else
        {
            (q->rear)++;
            q->data[q->rear] = x;
            return 1;
        }
    }
    int empty(sequeue * q)
    {
        if(q->front == q->rear)
            return 0;
        else
            return 1;
    }
    void print(sequeue * q)
    {
        if(q->front == q->rear)
            printf("ERROR!\n");
        else
        {
            while(empty(q))
            {
                q->front++;
                printf("%d\n",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\n\n",del(q));
        printf("Then the last data is:\n");
        print(q);
        return 0;
    }
    
    //链表实现
    
    #include <stdio.h>
    #include <malloc.h>
    typedef struct node
    {
        int data;
        struct node * next;
    }linklist;
    typedef struct
    {
        linklist * front, * rear;
    }linkqueue;
    linkqueue * q;
    //建立队列
    void initqueue(linkqueue * q)
    {
        q->front = (linkqueue *)malloc(sizeof(linklist));
        q->front->next = NULL;
        q->rear = q->front;
    }
    //判断队列空否
    int empty(linkqueue * q)
    {
        if(q->front == q->rear)
            return 1;
        else
            return 0;
    }
    //入队列
    void inqueue(linkqueue * q, int x)
    {
        q->rear->next = (linklist *)malloc(sizeof(linklist));
        q->rear->next->data = x;
        q->rear = q->rear->next;
        q->rear->next = NULL;
    }
    //出队列
    int outqueue(linkqueue * q)
    {
        linklist * s;
        if(empty(q))
            return NULL;
        else
        {
            s = q->front->next;
            printf("%d\n",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;
    }

    ps:转自http://www.cnblogs.com/vongang/ 

  • 相关阅读:
    剑指offer---尾到头打印链表
    剑指offer---链表中环的入口结点
    剑指offer---删除链表中重复的结点2
    剑指offer---删除链表中重复的结点
    6.shap以及selector的使用
    7.进度条(ProgressBar)
    5.toogleButton以及Switch
    4.基础控件
    3.触摸事件
    2.点击事件和页面切换
  • 原文地址:https://www.cnblogs.com/timeship/p/2622290.html
Copyright © 2020-2023  润新知