zoukankan      html  css  js  c++  java
  • 只有队尾指针的链式循环队列

       

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    typedef char DataType;
     
    typedef struct snode{    //链式堆栈结点类型定义
        DataType data;
        struct snode *next;
    }LSNode;
    typedef struct QNode{    //只有队尾指针的链式循环队列类型定义
        DataType data;
        struct QNode *next;
    }LQNode,*LinkQueue;
    //带头结点的链式堆栈初始化
    void InitStack(LSNode **head){
        if((*head=(LSNode *)malloc(sizeof(LSNode)))==NULL){
            printf("分配结点不成功");
            exit(-1);
        }else{
            (*head)->next=NULL;
        }
    }
    //判断带头结点链式堆栈是否为空。若是堆栈为空,返回1,不然返回0
    int StackEmpty(LSNode *head){
        if(head->next==NULL)
            return 1;
        else 
            return 0;
    }
    //链式堆栈进栈。进栈成功返回1,不然退出
    int PushStack(LSNode *head,DataType e){
        LSNode *s;
        if((s=(LSNode *)malloc(sizeof(LSNode)))==NULL)    //为结点分配空间,失败退出程序并返回-1
            exit(-1);
        else{
            s->data=e;    //把元素值赋值给结点的数据域
            s->next=head->next;    //将结点插入到栈顶
            head->next=s;
            return 1;
        }
    }
    //链式堆栈出栈,须要判断堆栈是否为空。出栈成功返回1,不然返回0
    int PopStack(LSNode *head,DataType *e){
        LSNode *s=(LSNode *)malloc(sizeof(LSNode));
        if(!s) exit(-1);
        s=head->next;    //指针s指向栈顶结点
        if(StackEmpty(head))    //判断堆栈是否为空
            return 0;
        else{
            head->next=s->next;    //头结点的指针指向第二个结点位置
            *e=s->data;    //要出栈的结点元素赋值给e
            free(s);    //释放要出栈的结点空间
            return 1;
        }
    }
    //将带头结点的链式循环队列初始化为空队列,须要把头结点的指针指向头结点
    void InitQueue(LinkQueue *rear){
        if((*rear=(LQNode*)malloc(sizeof(LQNode)))==NULL)
            exit(-1);        //若是申请结点空间失败退出
        else
            (*rear)->next=*rear;    //队尾指针指向头结点
    }
    //判断链式队列是否为空,队列为空返回1,不然返回0
    int QueueEmpty(LinkQueue rear){
        if(rear->next==rear)
            return 1;
        else
            return 0;
    }
    //将元素e插入到链式队列中,插入成功返回1
    int EnterQueue(LinkQueue *rear,DataType e){
        LQNode *s;
        s=(LQNode *)malloc(sizeof(LQNode));    //为将要入队的元素申请一个结点的空间
        if(!s)
            exit(-1);
        s->data=e;        //将元素值赋值给结点的数据域
        s->next=(*rear)->next;        //将新结点插入链式队列
        (*rear)->next=s;
        *rear=s;    //修改队尾指针
        return 1;
    }
    //删除链式队列中的队头元素,并将该元素赋值给e,删除成功返回1,不然返回0
    int DeleteQueue(LinkQueue *rear,DataType *e){
        LQNode *f,*p;
        if(*rear==(*rear)->next)        //在删除队头元素即出队列以前,判断链式队列是否为空
            return 0;
        else{
            f=(*rear)->next;    //使指针f指向头结点
            p=f->next;        //使指针p指向要删除的结点
            if(p==*rear){        //处理队列中只有一个结点的状况
                *rear=(*rear)->next;        //使指针rear指向头结点
                (*rear)->next=*rear;
            }else{
                f->next=p->next;    //使头结点指向要出队列的下一个结点
            }
            *e=p->data;    //把队头元素值赋值给e
            free(p);    //释放指针p指向的结点
            return 1;
        }
    }
    int main(){
        LinkQueue LQueue1,LQueue2;        /*定义链式循环队列*/
        LSNode *LStack1,*LStack2;        /*定义链式堆栈*/
        char str1[]="ASDFDSA";            /*回文字符序列1*/  
        char str2[]="QWEREWQ";            /*回文字符序列2*/
        char q1,s1,q2,s2;
        int i;
        InitQueue(&LQueue1);                /*初始化链式循环队列1*/
        InitQueue(&LQueue2);                /*初始化链式循环队列2*/
        InitStack(&LStack1);                /*初始化链式堆栈1*/
        InitStack(&LStack2);                /*初始化链式堆栈2*/
        for(i=0;i<strlen(str1);i++)
        {
            EnterQueue(&LQueue1,str1[i]);    /*依次把字符序列1入队*/
            EnterQueue(&LQueue2,str2[i]);    /*依次把字符序列2入队*/
            PushStack(LStack1,str1[i]);        /*依次把字符序列1进栈*/
            PushStack(LStack2,str2[i]);        /*依次把字符序列2进栈*/
     
        }
        printf("字符序列1:
    ");
        printf("出队序列  出栈序列
    ");
        while(!StackEmpty(LStack1))            /*判断堆栈1是否为空*/
        {
            DeleteQueue(&LQueue1,&q1);        /*字符序列依次出队,并把出队元素赋值给q*/
            PopStack(LStack1,&s1);            /*字符序列出栈,并把出栈元素赋值给s*/    
            printf("%5c",q1);                /*输出字符序列1*/
            printf("%10c
    ",s1);
            if(q1!=s1)                        /*判断字符序列1是不是回文*/
            {
                printf("字符序列1不是回文!");
                return 1;
            }
        }
        printf("字符序列1是回文!
    ");
        printf("字符序列2:
    ");
        printf("出队序列  出栈序列
    ");
        while(!StackEmpty(LStack2))            /*判断堆栈2是否为空*/
        {
            DeleteQueue(&LQueue2,&q2);        /*字符序列依次出队,并把出队元素赋值给q*/
            PopStack(LStack2,&s2);            /*字符序列出栈,并把出栈元素赋值给s*/
            printf("%5c",q2);                /*输出字符序列2*/
            printf("%10c
    ",s2);
            if(q2!=s2)                        /*判断字符序列2是不是回文*/
            {
                printf("字符序列2不是回文!
    ");
                return 1;
            }
        }
        printf("字符序列2是回文!
    ");
        system("pause");
    }

             

  • 相关阅读:
    MybatisPlus自动填充公共字段的策略
    docker内的应用访问宿主机上的mysql和Redis
    Spingboot整合Redis,用注解(@Cacheable、@CacheEvict、@CachePut、@Caching)管理缓存
    集群中的session共享问题解决方案
    Java并发之原子性,有序性,可见性,以及Happen-Before原则
    Java NIO技术概述
    Java反射机制总结
    java线程以及定时任务
    java流概述以及文件读写示例
    CSS常用内容总结(二)
  • 原文地址:https://www.cnblogs.com/LiangPF/p/14748666.html
Copyright © 2011-2022 走看看