• 妙趣横生的算法--栈和队列


    栈                                                                      

    栈的特点是先进后出,一张图简单介绍一下。image

    #include "stdio.h"
    #include "math.h"
    #include "stdlib.h"
    #define STACK_INIT_SIZE 20
    #define STACKINCREMENT 10
    
    typedef  char ElemType;
    typedef struct{
        ElemType *base;
        ElemType *top;
        int stacksize;
    }sqStack;
    
    void initStack(sqStack *s)
    {
        /*内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/
        s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
        if(!s->base) exit(0);     /*分配空间失败*/
        s->top = s->base;       /*最开始,栈顶就是栈底*/
        s->stacksize = STACK_INIT_SIZE;   /*最大容量为STACK_INIT_SIZE */
    }
    void Push(sqStack *s, ElemType e){
        if(s->top - s->base >= s->stacksize){
        /*栈满,追加空间*/
        s->base = (ElemType *)realloc(s->base, (s->stacksize + 
        STACKINCREMENT)*sizeof(ElemType));
        if(!s->base) exit(0);   /*存储分配失败*/
        s->top = s->base + s->stacksize;
        s->stacksize = s->stacksize + STACKINCREMENT; /*设置栈的最大容量*/
        }
        *(s->top) = e;  /*放入数据*/
            s->top++;
    }
    
    void Pop(sqStack *s , ElemType *e){
        if(s->top == s->base) return;//栈里面没有元素了则返回
        *e = *--(s->top); //删除栈顶的元素    
    }
    
    int StackLen(sqStack s){
        return (s.top - s.base) ;//计算栈的长度 
    }
    void main()
    {
        ElemType c;
        sqStack s;
        int len , i , sum = 0;
        printf("Please input a Binary digit
    ");
    
        initStack(&s);  /*创建一个栈,用来存放二进制字符串*/
        /*输入0/1字符表示的二进制数,以#结束*/
        scanf("%c",&c);
        while(c!='#')//遇到#则结束
        {
            Push(&s,c);//输入一个压入一个
            scanf("%c",&c);
        }
        len = StackLen(s);  /*得到栈中的元素个数,即二进制数的长度*/
    
        for(i=0;i<len;i++){
            Pop(&s,&c);
            sum = (int)(sum + (c-48) * pow(2,i));  /*转换为十进制*/
            //二进制转十进制的算法 
        }
        printf("Decimal is %d
    ",sum);
    }

    队列                                                                  

    队列的特点是先进先出,就跟我们平常排队一个意思。image

    #include "stdio.h"
    #include "stdlib.h"
    typedef char ElemType;
    typedef struct QNode{
        ElemType data;
        struct QNode *next;
    } QNode , *QueuePtr;
    typedef struct{
        QueuePtr front;   //队头指针
        QueuePtr rear;    //队尾指针
    }LinkQueue;
    
    void initQueue(LinkQueue *q){
        /*初始化一个空队列*/
        q->front = q->rear = (QueuePtr)malloc(sizeof(QNode)); /*创建一个头结点,队头队尾指针                                                                指向该结点*/
        if( !q->front) exit(0);     /*创建头结点失败*/
        q->front->next = NULL;     /*头结点指针域置NULL*/
    }
    
    void EnQueue(LinkQueue *q, ElemType e){
        QueuePtr p;
        p = (QueuePtr)malloc(sizeof(QNode));  /*创建一个队列元素结点*/
        if( !q->front) exit(0);     /*创建头结点失败*/
        p->data = e;//元素节点写入数据
        p->next = NULL;//元素节点的向后的指针指向空
        q->rear ->next = p;//将队列中的队尾指针指向刚生成的元素节点
        q->rear = p;
    }
    void DeQueue(LinkQueue *q, ElemType *e){
        /*如果队列q不为空,删除q的队头元素,用e返回其值*/
        QueuePtr p;
        if(q->front == q->rear) return;  /*队列为空,返回*/
        p = q->front->next;//队头给p
        *e = p->data;//取出来的队头的数据
        q->front->next = p->next;//取出来的队头的下一个指向给新的队头的指向
        if(q->rear == p) q->rear = q->front;  /*如果队头就是队尾,则修改队尾指针*/
        free(p);
    }
    /*测试函数*/
    void main()
    {
        ElemType e;
        LinkQueue  q;
        initQueue(&q);           /*初始化一个队列q*/
        printf("Please input a string into a queue
    ");
        scanf("%c",&e);
        while(e!='@'){
            EnQueue(&q,e);   /*向队列中输入字符串,以@表示结束*/ 
            scanf("%c",&e);
        }
        printf("The string into the queue is
    ");
        while(q.front != q.rear){   /*将队列中的元素出队列,并打印在屏幕上*/
            DeQueue(&q,&e);
            printf("%c",e);
        }
        printf("
    ");
    }

    转载请注明出处:http://www.cnblogs.com/yydcdut/p/3667093.html

  • 相关阅读:
    分布式文档存储数据库 MongoDB
    MongoDB运行状态、性能监控,分析
    Mongodb在Linux下的安装和启动和配置
    mongodb 状态监控命令详解
    Asp.net Core 入门实战 2.请求流程
    Asp.net Core 入门实战
    前后端分离之CORS和WebApi
    2.CLI标准
    JavaScript的引入方式
    CSS选择器的优先级
  • 原文地址:https://www.cnblogs.com/yydcdut/p/3667093.html
Copyright © 2020-2023  润新知