数据结构栈和队列的实现

栈:

#include <iostream>

#include<stdio.h>

#define size 10

#define insize 10

#define OK 1

#define ERROR 0

#include<malloc.h>

using namespace std;

typedef struct{

    int *base;

    int *top;

    int stacksize;

}stack;

int Initstack(stack &s);//建立空栈

int Push(stack &s,int e);//压栈函数 将e中的值压入栈顶

int Pop(stack &s,int&e);//将栈顶元素用e返回

int StackLength(stack s);//返回栈的元素个数,即栈的长度

int OperateMenu();//建立菜单,提示操作代码

int GetTop(stack s,int &e);//返回栈顶元素

int DestroyStack(stack &s);//销毁栈

int ClearStack(stack &s);//清空栈中所有元素

int scanfs(stack &s);//向栈中输入元素

void print(stack s);//将栈中元素全部弹出并打印

int main()

{

    stack s;

    s.base=NULL;

    int e;

    char ch;

    printf("是否要进行操作?(继续输入Y或者y,否则结束)\n");

    scanf("%c",&ch);

   while(ch=='Y'||ch=='y'){

    switch(OperateMenu()){

        case 1:

            Initstack(s);

            if(s.base!=NULL)printf("创建成功!\n");

            break;

        case 2:

        if(s.base==NULL){

            printf("请先建栈!\n");

            break;

        }

        else{

            scanfs(s);

            if(s.base!=s.top)printf("输入成功!\n");

            break;

        }

        case 3:

            if(s.base==NULL){

            printf("请先建栈!\n");

            break;

        }

        else {

            int n=StackLength(s);

            printf("请输入进栈元素:\n");

            scanf("%d",&e);

            Push(s,e);

            if(StackLength(s)>n)printf("压入成功!\n");

            break;

        }

        case 4:

            if(s.base==NULL){

            printf("请先建栈!\n");

            break;

        }else{

            GetTop(s,e);

            printf("栈顶元素为%d\n",e);

            break;

        }

        case 5:

            if(s.base==NULL){

            printf("请先建栈!\n");

            break;

        }else{

            if(s.top!=s.base){

            printf("栈中全部元素为:");

            print(s);

            break;

            }else{printf("该栈为空栈!\n");break;}

        }

        case 6:

           if(s.base==NULL){

            printf("请先建栈!\n");

            break;

        }else{

            printf("栈中元素个数为:%d",StackLength(s));

            break;

        }

        case 7:

           if(s.base==NULL){

            printf("请先建栈!\n");

            break;

        }else{

            Pop(s,e);

            printf("栈弹出栈顶元素为:%d",e);

            break;

        }

        case 8:

            if(s.base==NULL){

            printf("请先建栈!\n");

            break;

            }else{

                DestroyStack(s);

                break;

            }

            case 9:

            if(s.base==NULL){

            printf("请先建栈!\n");

            break;

            }else{

                ClearStack(s);

                break;

            }

 

    }

    printf("\n是否还要继续操作?(继续输入Y或者y,否则结束)\n");

    ch=getchar();

    scanf("%c",&ch);

   }

}

 

int Initstack(stack &s){//建立空栈

    s.base=(int*)malloc(size*sizeof(int));

    if(!s.base)return ERROR;

    s.top=s.base;

    s.stacksize=size;

    return OK;

}

int Push(stack &s,int e){//压栈函数 将e中的值压入栈顶

    if(s.top-s.base>=s.stacksize){

        s.base=(int*)realloc(s.base,(s.stacksize+insize)*sizeof(int));

        if(!s.base)return ERROR;

        s.top=s.base+s.stacksize;

        s.stacksize+=insize;

    }

    *s.top++=e;

    return OK;

}

int Pop(stack &s,int&e){//将栈顶元素用e返回

    if(s.top==s.base)return ERROR;

    e=*--s.top;

    return OK;

}

int StackLength(stack s){//返回栈的元素个数,即栈的长度

    return s.top-s.base;

}

int GetTop(stack s,int &e){//返回栈顶元素

    if(s.base==s.top)return ERROR;

    e=*(--s.top);

    return OK;

}

int DestroyStack(stack &s){//销毁栈

    if(s.base){

        free(s.base);

        s.stacksize=0;

        printf("销毁成功!\n");

        s.base=s.top=NULL;

    }

    return OK;

}

int ClearStack(stack &s){//清空栈中所有元素

    if(s.base!=s.top){

        s.base=s.top;

        s.stacksize=size;

        printf("清空成功!\n");

    }

}

int OperateMenu(){//建立菜单,提示操作代码

    int num;

    printf("---------------------------------\n");

    printf("1:建立空栈!\n2:输入数据!\n3:向栈顶压入一个元素!\n4:获得栈顶元素并打印!\n5:将栈中所有元素打印出来!\n6:返回栈的元素个数!\n7:弹出栈顶元素并打印!\n8:选择销毁栈!\n9:清空栈中的内容!\n");//提供菜单选项

    scanf("%d",&num);

    for(int i=0;;i++){

        if(num<1||num>9){printf("选择错误!");return -1;}

        else if(num==1){return num;break;}

        else if(num==2){return num;break;}

        else if(num==3){return num;break;}

        else if(num==4){return num;break;}

        else if(num==5){return num;break;}

        else if(num==6){return num;break;}

        else if(num==7){return num;break;}

        else if(num==8){return num;break;}

        else if(num==9){return num;break;}

    }

}

int scanfs(stack &s){//向栈中输入元素

    int e;

    printf("请输入:(输入-1结束)");

    for(int i=0;;i++){

        scanf("%d",&e);

        if(e==-1)break;

        Push(s,e);

    }

    return OK;

}

void print(stack s){//将栈中元素全部弹出并打印

    int e;

     for(int i=0;;i++){

    if(s.top==s.base)break;

    Pop(s,e);

    printf("%d\t",e);

    }

}

实验结果:

  1. 栈的建立

83f6f5e6e3354606a3cec09f4550f20a.png

  1. 栈的初始化(输入1 2 3 4 5 6 7 8 9 ,-1结束)

53546e37184f481bbb32c6d3debd2fff.png

  1. 入栈并打印内容(输入10)

44543e8eb82548de9ee437ceff5e26b5.png

  1. 出栈

4303bf9bd0a247e88720aee9de13c132.png

  1. 清空栈并查看

701e4d7d2a87403b874a44ef9809da14.png

  1. 销毁栈并判断栈空

2adf31d9e67345ca83ef6081ba4481be.png

队列:

实验代码:

#include <iostream>

#include<stdio.h>

#define size 10

#define insize 10

#define OK 1

#define ERROR 0

#include<malloc.h>

using namespace std;

typedef struct{

    int *base;//初始化的动态分配空间

    int front;

    int rear;

    int qlist;

}Sq;

int InitQueue(Sq &q);//构造一个空队列q

int QueueLength(Sq q);//返回q的元素个数,即队列长度

int EnQueue(Sq &q,int e);//插入元素e为q的新元素

int DeQueue(Sq &q,int &e);//若队列不空,则删除q的队头元素,并用e返回其值

int GetHead(Sq &q,int &e);//用e返回队头元素

int DestroyQueue(Sq &q);//若队列存在,将队列销毁

int ClearQueue(Sq &q);//若队列存在,清空队列元素

int OperateMenu();//建立菜单,提示操作代码

int scanfs(Sq &q);//向队列中输入元素

void print(Sq q);//将队列中元素全部弹出并打印

int main()

{

    Sq s;

    s.base=NULL;

    int e;

    char ch;

    printf("是否要进行操作?(继续输入Y或者y,否则结束)\n");

    scanf("%c",&ch);

   while(ch=='Y'||ch=='y'){

    switch(OperateMenu()){

         case 1:

            InitQueue(s);

            if(s.base!=NULL)printf("创建成功!\n");

            break;

          case 2:

        if(s.base==NULL){

            printf("请先建队列!\n");

            break;

        }

        else{

            scanfs(s);

            if(s.rear!=s.front)printf("输入成功!\n");

            break;

        }

        case 3:

            if(s.base==NULL){

            printf("请先建队列!\n");

            break;

        }

        else {

            int n=QueueLength(s);

            printf("请输入添加队尾元素:\n");

            scanf("%d",&e);

            EnQueue(s,e);

            if(QueueLength(s)>n)printf("添加成功!\n");

            break;

        }

        case 4:

            if(s.base==NULL){

            printf("请先建队列!\n");

            break;

        }

        else {

            GetHead(s,e);

            printf("队头元素为%d",e);

            break;

        }

        case 5:

            if(s.base==NULL){

            printf("请先建队列!\n");

            break;

        }else{

            if(s.front!=s.rear){

            printf("队列中全部元素为:");

            print(s);

            break;

            }else{printf("该队列为空队列!\n");break;}

        }

        case 6:

           if(s.base==NULL){

            printf("请先建队列!\n");

            break;

        }else{

            printf("队列中元素个数为:%d",QueueLength(s));

            break;

        }

        case 7:

           if(s.base==NULL){

            printf("请先建队列!\n");

            break;

        }else{

            DeQueue(s,e);

            printf("删除的队头元素为:%d",e);

            break;

        }

        case 8:

           if(s.base==NULL){

            printf("请先建队列!\n");

            break;

        }else{

            DestroyQueue(s);

            if(s.base==NULL)printf("销毁成功!\n");

            break;

        }

        case 9:

           if(s.base==NULL){

            printf("请先建队列!\n");

            break;

        }else{

            ClearQueue(s);

            if(s.front==s.rear)printf("清空成功!\n");

            break;

        }

   }

    printf("\n是否还要继续操作?(继续输入Y或者y,否则结束)\n");

    ch=getchar();

    scanf("%c",&ch);

   }

}

int InitQueue(Sq &q){//构造一个空队列q

    q.base=(int*)malloc(size*sizeof(int));//分配一定大小的空间

    if(!q.base)return ERROR;//分配空间失败

    q.front=q.rear=0;

    q.qlist=size;

    return OK;

}

int QueueLength(Sq q){//返回q的元素个数,即队列长度

    return (q.rear+q.qlist-q.front)%q.qlist;

}

int EnQueue(Sq &q,int e){//插入元素e为q的新元素

    int *n,p,r;

    if((q.rear+1)%q.qlist==q.front){

        n=(int*)realloc(q.base,(q.qlist+insize)*sizeof(int));//在在原空间增加一点空间

        if(!n)return ERROR;

        q.base=n;

        p=q.qlist;//保存新加的空间位置

        q.qlist+=insize;

        if(q.rear<q.front){//如果追加的空间在队尾之后,因为顺序队列需要连续使用,所以需要将存储在对头之前的元素移动到后面

            r=0;//记录需要转移的位置

            for(r;q.rear-r>0;r++){

            q.base[p]=q.base[r];

            p++;//交换值之后位置加一,循环继续执行

        }

        q.rear=p;//修改队尾位置

        }

    }//若空间不够则追加insize大小的空间

    q.base[q.rear]=e;

    q.rear=(q.rear+1)%q.qlist;

    return OK;

}

int DeQueue(Sq &q,int &e){//若队列不空,则删除q的队头元素,并用e返回其值

    if(q.front==q.rear)return ERROR;

    e=q.base[q.front];

    q.front=(q.front+1)%q.qlist;

    return OK;

}

int GetHead(Sq &q,int &e){//用e返回队头元素

    e= q.base[q.front];

    return OK;

}

int DestroyQueue(Sq &q){//若队列存在,将队列销毁

    if(q.base!=NULL){

        free(q.base);

        q.base=NULL;

    }

    return OK;

}

int ClearQueue(Sq &q){//若队列存在,清空队列元素

    q.front=q.rear;

    q.qlist=size;

    return OK;

}

int OperateMenu(){//建立菜单,提示操作代码

    int num;

    printf("---------------------------------\n");

    printf("1:建立空队列!\n2:输入数据!\n3:向队尾加入一个元素!\n4:获得队头元素并打印!\n5:将队列中所有元素打印出来!\n6:返回队列的元素个数!\n7:删除队头元素并打印!\n8:选择销毁队列!\n9:清空队列中的内容!\n");//提供菜单选项

    scanf("%d",&num);

    for(int i=0;;i++){

        if(num<1||num>9){printf("选择错误!");return -1;}

        else if(num==1){return num;break;}

        else if(num==2){return num;break;}

        else if(num==3){return num;break;}

        else if(num==4){return num;break;}

        else if(num==5){return num;break;}

        else if(num==6){return num;break;}

        else if(num==7){return num;break;}

        else if(num==8){return num;break;}

        else if(num==9){return num;break;}

    }

}

int scanfs(Sq &q){//向队列中输入元素

    int e;

    printf("请输入:(输入-1结束)");

    for(int i=0;; i++)

    {

        scanf("%d",&e);

        if(e==-1)break;

        EnQueue(q,e);

    }

    return OK;

}

void print(Sq q){//将队列中元素全部弹出并打印

    int e;

    for(int i=0;; i++)

    {

        if(q.front==q.rear)break;

        DeQueue(q,e);

        printf("%d\t",e);

    }

}

实验结果:

  1. 建立空队列

e10c1788e1bf4d60aa9efdb247190a5e.png

  1. 初始化队列(输入1 2 3 4 5 6 7  8 9 ,-1结束)

d71c891e10dc4b98a7d70321604c6d7c.png

  1. 入队列并打印(输入10)

051bca106a654d20a7650ddbc2a6f473.png

  1. 出队列(删除队头元素)

ffdc14b4f6d047d0a9dba388ad5843a2.png

  1. 获得队头元素

7ee2f9c468e542f9b4f70ed82321b747.png

  1. 清空队列并判断

648a640aa3ec4660929e2ae9673725e8.png

  1. 销毁队列并判断

02602d58817e4654b94ffbb31e8403ed.png

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值