栈和队列

    栈和队列

                        括号匹配

//检查一个表达式的括号匹配问题,算数表达式存储于字符数组中。

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 20

typedef struct

{

    char data[MAXSIZE];                                             //顺序栈存储空间

    int top;                                                        //栈顶指针

}SeqStack;                                                           //顺序栈类型

void Init_SeqStack(SeqStack**s)                                     //顺序栈初始化

{

    *s=(SeqStack *)malloc(sizeof(SeqStack));                       //在主调函数中申请占空间

    (*s)->top=-1;                                                     //置栈空标志

}

int Empty_SeqStack(SeqStack*s)                                        //判栈空

{

    if(s->top==-1)                                                    //栈为空

    return 1;

    else

    return 0;

}

void Push_SeqStack(SeqStack*s,char x)                                //元素入栈

{

    if(s->top==MAXSIZE-1)                                             //栈已满

    printf("Stack is full!\n");

    else

    {

        s->top++;

        s->data[s->top]=x;                                             //将元素压入栈

    }

}

void Pop_SeqStack(SeqStack*s,char *x)                 //元素出栈并将元素返回给主调函数

{

    if(s->top==-1)

    printf("Error!\n");                                                //栈为空

    else

    {

        *x=s->data[s->top];                                             //栈顶元素出栈

        s->top--;

    }

}

void Top_SeqStack(SeqStack*s,char *x)                                  //取栈顶元素

{

    if(s->top==-1)

    printf("Stack is empty!\n");                                         //栈为空

    else

    *x=s->data[s->top];                                                    //取栈顶元素值

}

void Correct(char ex[])                                     //检查算数表达式中的括号匹配

{

    SeqStack *p;

    char x,*ch=&x;

    int i=0;

    Init_SeqStack(&p);                                          //顺序栈初始化为空

    while(ex[i]!='\0')                                            //扫描算数表达式未结束

    {

        if(ex[i]=='('||ex[i]=='['||ex[i]=='{')              //扫描字符为(【{则入栈

           Push_SeqStack(p,ex[i]);

          if(ex[i]==')'||ex[i]==']'||ex[i]=='}')

           {

               Top_SeqStack(p,ch);                       //读出栈顶字符

              if(ex[i]==')'&&*ch=='(')          //栈顶字符与当前扫描字符匹配则出栈

               {

                   Pop_SeqStack(p,ch);

               i++;

               continue;

           }

           if(ex[i]==']'&&*ch=='[')

           {

               Pop_SeqStack(p,ch);

               i++;

               continue;

           }

           if(ex[i]=='}'&&*ch=='{');

           {

               Pop_SeqStack(p,ch);

           i++;

           continue;

    }

           }                                                  //继续扫描下一个字符

}

if(!Empty_SeqStack(p))                 //算数表达式结束或非正常结束时若栈不为空则不配对

printf("Error!\n");

else

printf("Right!\n");

}

void main()

{

    char x[30];

    printf("Input exp:\n");                                       //输入一个算数表达式

    scanf("%s",x);

    Correct(x);                                           //检查算数表达式中括号是否匹配

}

                       链和队列基本运算

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 30

typedef struct node

{

    char data;

    struct node *next;

}QNode;                                                        //链队列结点类型

typedef struct

{

    QNode *front,*rear;                         //将头、尾指针纳入到一个结构体的连队列

}LQueue;                                                        //链队列类型

void Init_LQueue(LQueue**q)                                   //创建一个带头结点的空队列

{

    QNode *p;

    *q=(LQueue *)malloc(sizeof(LQueue));                        //申请带头、尾指针的结点

    p=(QNode *)malloc(sizeof(QNode));                           //申请连队列的头结点

    p->next=NULL;                                               //头结点的nex指针置为空

    (*q)->front=p;                                              //队头指针指向头结点

    (*q)->rear=p;                                                 //队尾指针指向头结点

}

int Empty_LQueue(LQueue*q)                                      //判队为空

{

    if(q->front==q->rear)                                         //队为空

    return 1;

    else

    return 0;

}

void In_LQueue(LQueue *q,charx)                                   //入队

{

    QNode *p;

    p=(QNode *)malloc(sizeof(QNode));                              //申请新连队列结点

    p->data=x;

    p->next=NULL;                                  //新结点作为队尾结点时其next域为空

    q->rear->next=p;                                 //将新结点*p链到原队尾结点之后

    q->rear=p;                                        //使队尾指针指向新的队尾结点*p

}

void Out_LQueue(LQueue*q,char *x)                                 //出队

{

    QNode *p;

    if(Empty_LQueue(q))

    printf("Queue is empty!\n");                                      //队空,出队失败

    else

    {

        p=q->front->next;                          //指针p指向看、链队列第一个数据结点

        q->front->next=p->next;          //头结点的next指针指向链队列第二个数据元素结点

        *x=p->data;                               //将删除的队头结点数据经由指针x返回

        free(p);

        if(q->front->next==NULL)                           //出队后队为空,则置为空队列

        q->rear=q->front;

    }

}

void print(LQueue *q)                                                   //队列输出

{

    QNode *p;

    p=q->front->next;

    while(p!=NULL)

    {

        printf("%4c",p->data);

        p=p->next;

    }

    printf("\n");

}

void main()

{

    LQueue *q;

    char x,*y=&x;                                              //出队元素经指针y传给x

    Init_LQueue(&q);                                                      //链队列初始化

    if(Empty_LQueue(q))                                                    //判对空

    printf("Queue is empty!\n");

    printf("Input anystring:\n");                                  //给链队列输入元素

    scanf("%c",&x);

    while(x!='\n')

    {

        In_LQueue(q,x);                                                   //元素入队

        scanf("%c",&x);

    }

    printf("Output element ofQueue:\n");

    print(q);                                                               //链队列输出

    printf("Output queue:\n");

    Out_LQueue(q,y);                                                       //元素出队

    printf("Element of output Queue is%c\n",*y);                          //输出出队元素值

    printf("Output element ofQueue:\n");

    print(q);                                        //输出出队后的连队列的元素值

}

                             链栈的基本运算

#include <stdio.h>

#include <stdlib.h>

typedef struct node

{

    char data;

    struct node *next;

}StackNode;                                                                  //链栈元素类型

void Init_LinkStack(StackNode**s)                                            //链栈初始化

{

    *s=NULL;

}

int Empty_LinkStack(StackNode*s)                                   //判断链栈是否为空

{

    if(s==NULL)

    return 1;

    else

    return 0;

}

void Push_LinkStack(StackNode**top,char x)                            //链栈元素入栈

{

    StackNode *p;

    p=(StackNode*)malloc(sizeof(StackNode));                 //生成链栈元素的存储空间

    p->data=x;

   p->next=*top;                            //新生成的栈顶元素*p其后继为原栈顶元素**p

    *top=p;                                         // 栈顶指针*top指向新的栈顶元素*p

}

void Pop_LinkStack(StackNode**top,char *x)                             //链栈元素出栈

{

    StackNode *p;

    if(*top==NULL)

    printf("Stack is empty!\n");                                     //栈为空

    else

    {

        *x=(*top)->data;                            //栈顶元素经指针x传给对应的变量

        p=*top;

        *top=(*top)->next;                         //栈顶指针*top指向出栈后的新栈顶元素

        free(p);

    }

}

void print(StackNode *p)                                                 //链栈输出

{

    while(p!=NULL)

    {

        printf("%c",p->data);

        p=p->next;

    }

    printf("\n");

}

void main()

{

    StackNode *s;

    char x,*y=&x;                                             //出栈元素经过指针传给x

    Init_LinkStack(&s);                                                  //链栈初始化

    if(Empty_LinkStack(s));                                             //判断链栈是否为空

    printf("Stack isempty!\n");

    printf("Input anystring:\n");                                            //链栈元素入栈

    scanf("%c",&x);

    while(x!='\n')

    {

        Push_LinkStack(&s,x);

        scanf("%c",&x);

    }

    printf("Output string :\n");

    print(s);                                                                //链栈元素输出

    printf("Output stack :\n");

    Pop_LinkStack(&s,y);                                                      //链栈元素出栈

    printf("Elenment of Output stack is%c\n",*y);                           //输出出栈元素

    printf("Output string:\n");

    print(s);                                                               //链栈输出

}

                            顺序栈基本实现

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 20

typedef struct

{

    char data[MAXSIZE];                                                 //栈中元素存储空间

    int top;                                                                //栈顶指针

}SeqStack;                                                                   //顺序栈类型

void Init_SeqStack(SeqStack**s)                                             //顺序栈初始化

{

    *s=(SeqStack*)malloc(sizeof(SeqStack));                  //在主调函数中申请栈空间

    (*s)->top=-1;                                                             //置栈空标志

}

int Empty_SeqStack(SeqStack*s)                                           //判栈是否为空

{

    if(s->top==-1)                                                            //栈为空

    return 1;

    else

    return 0;

}

voidPush_SeqStack(SeqStack*s,char x)                               //顺序栈元素入栈

{

    if(s->top==MAXSIZE-1)

    printf("Stack is full!\n");                                                 //栈已满

    else

    {

        s->top++;

        s->data[s->top]=x;                                          //元素x压入*s中

    }

}

void Pop_SeqStack(SeqStack*s,char *x)     //将栈中的栈顶元素出栈并通过参数x返回给主调函数

{

    if(s->top==-1)

    printf("Stack is empty!\n");                                                  //栈为空

    else

      {

          *x=s->data[s->top];                                          //栈顶元素出栈

          s->top--;

      }

}

void Top_SeqStack(SeqStack*s,char *x)                           //取顺序栈栈顶元素

{

    if(s->top==-1)

    printf("Stack is empty!\n");                                       //栈为空

    else

        *x=s->data[s->top];                                             //取栈顶元素

}

void print(SeqStack *s)                                                     //顺序输出栈

{

    int i;

    for(i=0;i<=s->top;i++)

    printf("%4c",s->data[i]);

    printf("\n");

}

void main()

{

    SeqStack *s;

    char x,*y=&x;                           //y指向x的指针,出栈元素经过y传递给变量x

Init_SeqStack(&s);                                                     // 顺序栈初始化

if(Empty_SeqStack(s))                                                  //判栈是否为空

printf("Stack isempty!\n");

printf("Input data ofstack:\n");                                    //顺序栈元素入栈

scanf("%c",&x);

while(x!='\n')

{

    Push_SeqStack(s,x);

    scanf("%c",&x);

}

printf("Output all dataof stack:\n");

print(s);                                                      //输出顺序栈中的元素

Pop_SeqStack(s,y);                                                 //顺序栈元素的出栈

printf("Output data ofPop stack:%c\n",*y);                               //输出出栈元素

printf("Output all dataof stack:\n");

print(s);                                                    //输出出栈后顺序栈中的元素

Top_SeqStack(s,y);                                              //读取顺序栈栈顶元素

printf("Output data oftop stack:%c\n",*y);                         //输出读出的栈顶元素

printf("Output all dataof stack:\n");

print(s);                                                     //输出当前的顺序栈中元素

}

                      循环队列基本实现

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 20

typedef struct

{

    char data[MAXSIZE];                                            //队中元素存储空间

    int rear,front;                                                  //队尾队头指针

}SeQueue;                                                           //顺序队列类型

void Int_SeQueue(SeQueue**q)                                       //循环队列初始化

{

    *q=(SeQueue *)malloc(sizeof(SeQueue));                  //生成循环队列存储空间

    (*q)->front=0;                                     //队头与队尾指针相等则队为空

    (*q)->rear=0;

}

int Empty_SeQueue(SeQueue*q)                              //判断队列是否为空

{

    if(q->front==q->rear)                                              //队列为空

    return 1;

    else                                                              //队列不为空

    return 0;

}

void In_SeQueue(SeQueue*q,char x)                                     //元素入队

{

    if((q->rear+1)%MAXSIZE==q->front)

    printf("Queue is full!\n");                                   //队满,入队失败

    else

    {

        q->rear=(q->rear+1)%MAXSIZE;                             //队尾指指针加1

        q->data[q->rear]=x;                                             //将x入队

    }

}

void Out_SeQueue(SeQueue*q,char *x)                              //元素出队

{

    if(q->front==q->rear)

    printf("Queue is empty!\n");                                   //对空出队失败

    else

    {

       q->front=(q->front+1)%MAXSIZE;                               //队头指针加1

        *x=q->data[q->front];                   //队头元素出队并由x返回头元素值

    }

}

void print(SeQueue *q)                                                 //循环队列输出

{

    int i;

    i=(q->front+1)%MAXSIZE;

    while(i!=q->rear)

    {

        printf("%4c",q->data[i]);

        i=(i+1)%MAXSIZE;

    }

    printf("%4c\n",q->data[i]);

}

void main()

{

    SeQueue *q;

    char x,*y=&x;                                         //出队元素经指针y传给x

    Int_SeQueue(&q);                                                //循环队列初始化

    if(Empty_SeQueue(q))                                                   //判队空

    printf("Queue is empty!\n");

    printf("Input anystring:\n");                             //给循环队列输入元素

    scanf("%c",&x);

    while(x!='\n')

    {

        In_SeQueue(q,x);                                                 //元素入队

        scanf("%c",&x);

    }

    printf("Output element ofQueue:\n");

    print(q);                                                       //循环队列输出

    printf("Output Queue:\n");

    Out_SeQueue(q,y);                                                 //循环队列元素出队

    printf("Element of Output Queue is%c\n",*y);                            //输出出队元素

    printf("Output element ofQueue:\n");

    print(q);                                               //输出出队后的循环队列元素

}

                          队列和栈将元素逆置

//已知q是一个非空队列,仅用队列和栈以及少量工作变量完成队列元素的逆置

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 30

typedef struct

{

    char data[MAXSIZE];                                                   //顺序栈存储空间

    int top;                                                              //栈顶指针

}SeqStack;                                                                 //顺序栈类型

void Init_SeqStack(SeqStack**s)                                          //顺序栈初始化

{

    *s=(SeqStack *)malloc(sizeof(SeqStack));                        //在主调函数中申请栈空间

    (*s)->top=-1;                                                          //置栈空标志

}

int Empty_SeqStack(SeqStack*s)                                           //判栈空

{

    if(s->top==-1)                                                         //栈为空时

    return 1;

    else

    return 0;

}

void Push_SeqStack(SeqStack*s,char x)                                     //元素入栈

{

    if(s->top==MAXSIZE-1)

    printf("Stackis full!\n");                                             //栈已满

    else

    {

        s->top++;

        s->data[s->top]=x;                                                  //元素压入栈中

    }

}

    void Pop_SeqStack(SeqStack *s,char *x)                                     //元素出栈

    {

        if(s->top==-1)

        printf("Stack isempty!\n");                                            //栈为空

        else

        {

            *x=s->data[s->top];                                            //栈顶元素出栈

            s->top--;

        }

    }

    typedef struct

    {

        char data[MAXSIZE];                                               //队中元素存储空间

        int rear,front;                                                    //队尾和队头指针

    }SeQueue;                                                                 //顺序对类型

    void Init_SeQueue(SeQueue **q)                                     //循环队列初始化

    {

        *q=(SeQueue *)malloc(sizeof(SeQueue));

        (*q)->front=0;

        (*q)->rear=0;

    }

    int Empty_SeQueue(SeQueue *q)                                              //判队空

    {

        if(q->front==q->rear)

        return 1;

        else

        return 0;

    }

    void In_SeQueue(SeQueue *q,char x)                                       //元素入队

    {

        if((q->rear+1)%MAXSIZE==q->front)

        printf("Queue isfull!\n");                               //队满,入队失败

        else

        {

            q->rear=(q->rear+1)%MAXSIZE;                             //队尾指针加一

            q->data[q->rear]=x;                                                  //元素入队

        }

    }

    void Out_SeQueue(SeQueue *q,char *x)                                      //元素出队

    {

        if(q->front==q->rear)

        printf("Queue isempty!\n");                                  //队空出队失败

        else

        {

           q->front=(q->front+1)%MAXSIZE;                                   //队头指针加一

            *x=q->data[q->front];                           //对头元素出队并返回元素值

        }

    }

    void print(SeQueue *q)                                           //循环队列输出

    {

        int i;

        i=(q->front+1)%MAXSIZE;

        while(i!=q->rear)

        {

           printf("%4c",q->data[i]);

            i=(i+1)%MAXSIZE;

        }

        printf("%4c",q->data[i]);

            }

       void Revers_Queue(SeQueue *q,SeqStack*s)                     //用栈逆置队列

       {

           char x,*p=&x;

           Init_SeqStack(&s);                                         //栈初始化

           while(!Empty_SeQueue(q))

           {

               Out_SeQueue(q,p);                                    //取出队头元素

               Push_SeqStack(s,*p);                                  //将对头元素压入栈

           }

           while(!Empty_SeqStack(s))

           {

               Pop_SeqStack(s,p);                                     //栈顶元素出栈

               In_SeQueue(q,*p);                                      //将栈顶元素入队

           }

       }

       void main()

       {

           SeqStack *s;

           SeQueue *q;

           char x,*y=&x;

           Init_SeqStack(&s);                                         //顺序栈初始化

           Init_SeQueue(&q);                                   //循环队列初始化

           if(Empty_SeQueue(q))                                                //判队空

           printf("Queue isempty!\n");

           printf("Input anystring:\n");                           //给队列输入元素

           scanf("%c",&x);

           while(x!='\n')

           {

               In_SeQueue(q,x);                                    //元素入队

               scanf("%c",&x);

           }

           printf("Output element ofQueue:\n");                     //输出队列元素

           print(q);

           printf("\nConver Queue\n");

           Revers_Queue(q,s);                                       //队列元素逆置

           printf("Output element of Queue:\n");

           print(q);                                            //输出逆置后的队列元素

       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值