zoukankan      html  css  js  c++  java
  • 基础数据结构(栈,队列)

    VonGang原创,转载请注明:http://www.cnblogs.com/vongang/  

    栈和队列都是最基础的数据结构,栈的思想是“先进后出”,队列的思想是“先进先出”。怎么说呢,栈和队列其实都是对于单链表或者数组的一些特殊操作。在后边很多算法中经常用到(比如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;
    } 
  • 相关阅读:
    Qt编程之qrc文件的链接
    Visual Studio中的lib的链接顺序
    c++语言中的遍历
    转载:使用 OpenCV 识别 QRCode
    GreenOpenPaint的实现(四)放大缩小处理滚动事件
    GreenOpenPaint的实现(六)图片的保存和打开
    GreenOpenPaint的实现(五)矩形框
    GreenOpenPaint的实现(三)添加标尺
    GreenOpenPaint的实现(二)打开显示图片
    GreenOpenPaint的实现(一)基本框架
  • 原文地址:https://www.cnblogs.com/vongang/p/2143132.html
Copyright © 2011-2022 走看看