只有队尾指针的链式循环队列

   

#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:\n");
    printf("出队序列  出栈序列\n");
    while(!StackEmpty(LStack1))            /*判断堆栈1是否为空*/
    {
        DeleteQueue(&LQueue1,&q1);        /*字符序列依次出队,并把出队元素赋值给q*/
        PopStack(LStack1,&s1);            /*字符序列出栈,并把出栈元素赋值给s*/    
        printf("%5c",q1);                /*输出字符序列1*/
        printf("%10c\n",s1);
        if(q1!=s1)                        /*判断字符序列1是不是回文*/
        {
            printf("字符序列1不是回文!");
            return 1;
        }
    }
    printf("字符序列1是回文!\n");
    printf("字符序列2:\n");
    printf("出队序列  出栈序列\n");
    while(!StackEmpty(LStack2))            /*判断堆栈2是否为空*/
    {
        DeleteQueue(&LQueue2,&q2);        /*字符序列依次出队,并把出队元素赋值给q*/
        PopStack(LStack2,&s2);            /*字符序列出栈,并把出栈元素赋值给s*/
        printf("%5c",q2);                /*输出字符序列2*/
        printf("%10c\n",s2);
        if(q2!=s2)                        /*判断字符序列2是不是回文*/
        {
            printf("字符序列2不是回文!\n");
            return 1;
        }
    }
    printf("字符序列2是回文!\n");
    system("pause");
}

 

         

 

posted @ 2021-05-09 19:54  我真的看不懂  阅读(570)  评论(0编辑  收藏  举报