XCU栈和队列大作业

#include <stdio.h>
#include <cstring>

#define MaxSize 100
typedef int ElemType;
typedef struct
{
    char name[20];
}Name;
typedef struct{
    Name data[MaxSize];
    int front; //对头指针
    int rear;  //队尾指针
}SeqQueue;

typedef struct SqStack{
    int data[MaxSize];
    int top;
}SqStack;
//初始化栈
void InitStack(SqStack &s){
    s.top=-1;
}

//判断栈是否为空
bool Empty(SqStack s){
    if(s.top==-1){
        return true;
    } else return false;
}
//入栈
void Push(SqStack &s,int x){
 if(s.top==MaxSize-1){
     printf("栈满");
     return;
 }
 s.data[++s.top]=x;

}
void Push_char(SqStack &s,char x){
    if(s.top==MaxSize-1){
        printf("栈满");
        return;
    }
    s.data[++s.top]=x;

}
//出栈
void Pop(SqStack &s,int &x){
    if(s.top==-1){
        printf("栈空");
        return;
    }
    x=s.data[s.top--];
}
//遍历栈
void PrintStack(SqStack s){
    while (s.top!=-1){
        printf("%d",s.data[s.top]);
        s.top--;
    }
    printf("\n");
    return;
}
int PrintStack_char(SqStack s,char r){
    while (s.top!=-1){
        if(r==s.data[s.top])
        {s.data[s.top]='q'; //如果存在这个括号。(,给(赋值成q,防止后面(3+2)/4)的情况
            return 1;}

        s.top--;
    }
    return 0;
}
//销毁栈
//销毁栈
void DestroyStack(SqStack &S){
    S.top = -1;
}

//初始化队列
void InitQueue(SeqQueue &q){
    q.front=q.rear=0;
}

//入队
int EnQueue(SeqQueue* Q, char *e){
    if((Q->rear+1)%MaxSize== Q->front) return -1;//头指针大于尾指针,即进入下一轮(因为循环链表的问题导致的错误)
    strcpy(Q->data[Q->rear].name,e);     //用头指针返回e值
    Q->rear=(Q->rear+1)%MaxSize;     //头指针向前一位
    return 1;
}

//出队
int  DeQueue (SeqQueue *Q,char *e){
    //队列不空则删除Q头元素并用e返回,否则错误
    if(Q->front == Q->rear) return -1;
    strcpy(e , Q->data[Q->front].name);
    Q->front = (Q->front+1)%MaxSize;
    return 1;
}

//获取队列中元素个数
int QueueNum(SeqQueue* q){
    return (q->rear-q->front+MaxSize)%MaxSize;
}
int QueueEmpty(SeqQueue * q)   //判断队列是否为空
{
    return q->front == NULL;   //为空,返回1
}



int menu(int &q){
    int s;
    printf("输入一个十进制数:");
            scanf("%d", &q);
            printf("请选择:1.转二进制 2转八进制 3.转十六进制 4.从新输入一个十进制数 0.退出\n");
            scanf("%d", &s);
            if (s == 4) {
                printf("请从新输入");
                scanf("%d", &q);
                printf("请选择:1.转二进制 2转八进制 3.转十六进制 4.从新输入一个十进制数 0.退出\n");
                scanf("%d", &s);
                return s;
            } else if (s == 0)
                return 0;
            else
                return s;
        }



void Pipei(SqStack &L) {
    char s[20];
    int t=1;
    printf("请输入算式表达式:");
    scanf("%s",&s);

    for (int i = 0; i < strlen(s); i++) {
        if (s[i]=='(' || s[i]=='[' ||s[i]=='{')
            Push_char(L,s[i]);
        if (s[i]==']' || s[i]==')' ||s[i]=='}') {
            if (s[i] ==']')
                s[i]='[';
            if(s[i]==')')
                s[i]='(';
            if(s[i]=='}')
                s[i]='{';
               t = PrintStack_char(L, s[i]);
        }
        if (t==0)
        { printf("不匹配!");
            return;}


    }
    if(t==1)
        printf("匹配!");
};


void Two(SqStack &s,int x){
    while (x!=0){
    Push(s,x%2);
    x=x/2;}
    PrintStack(s);
}
void Eight(SqStack &s,int x){
    while (x!=0){
        Push(s,x%8);
        x=x/8;}
    PrintStack(s);
}
void Sixten(SqStack &s,int x){
    while (x!=0){
        Push(s,x%16);
        x=x/16;}
    PrintStack(s);
}
//求最大值函数
int Max(int n1,int n2){
    if(n2>n1)
        return n2;
    else return n1;}

void wuban(){
    int n1,v1; //参加舞会的男生和女生的数量
    int number;//舞会轮数
    int max;//男生,女生数量的最大值
    char t[20];//输入名字的时候的中间变量
    SeqQueue nan1,nv1;
    //初始化队列
    InitQueue(nan1);
    InitQueue(nv1);
    //
    printf("请输入参加舞会的男生数量和女生数量\n");
    printf("男生数量:");
    scanf("%d",&n1);
 //printf("\n");
    printf("女生数量:");
    scanf("%d",&v1);
   // printf("\n");
    max= Max(n1,v1);
    if(max%3==0) number=max/3;
    else number=max/3+1;
    printf("%d %d",n1,v1);
    for (int i = 1; i <=n1 ; i++) {
        printf("请输入第%d位男生的名字:\n",i);
        scanf("%s",t);
        printf("%s",t);
        EnQueue(&nan1,t);

    }
    printf("开始女生");
    for (int i = 1; i <=v1 ; i++) {
        printf("请输入第%d位女生的名字:\n",i);
        scanf("%s",t);
        EnQueue(&nv1,t);
    }
    printf("————开始配对————\n");

    for (int i = 1; i <= number; i++) { //开始Nnumber轮的循环

        char t1[20],t2[20];//作为出队的中间变量
        printf("---开始第%d轮配对---\n",i);
        for(int j=1;j<=3;j++){
        printf("第%d对:",j);
        DeQueue(&nan1,t1);
        printf("%s --- ",t1);
        DeQueue(&nv1,t2);
        printf("%s\n",t2);
            EnQueue(&nan1,t1);//出来的继续在后面排队
            EnQueue(&nv1,t2);
        }
    }
}
void yinhang(){

    int s;
    printf("请属于最后一个顾客的序号");
    scanf("%d",&s);
    int t[50];
    int t1[50];
    int k,j;
    k=0;
    j=0;
    for(int i=1;i<=s;i++){


        if(i%2==0)  {
          t[k]=i;
          k++;
            }
        else{
            t1[j]=i;
            j++;
        }}
int q,w;
    q=0;
    w=0;
    printf("顾客完成的顺序为:\n");
        while (t[q]!=0||t[w]!=0){
            if(t[q]!=0){
            printf("%d\n",t[q]);
            q++;}
            if(t[q]!=0)
            printf("%d\n",t[q]);
            q++;
            if(t1[w]!=0)
            printf("%d\n",t1[w]);
            w++;

        }
    }
int digui(int a){
    if (a==1) return a;
    else return (a* digui(a-1));
}


        


int main(){
   SqStack  L;
   int q;
   int a1;
    InitStack(L);
    while (1){
        printf("------开始菜单------\n");
        printf("请选择模式:1.转进制 2.匹配括号 3.舞会配对 4.银行排队 5.求阶乘\n");
        scanf("%d",&a1);
        switch (a1) {
            case 1:{
            int t=menu(q);
        DestroyStack(L);
    switch (t) {
        case 1:
            Two(L,q);
            break;
        case 2:
            Eight(L,q);
            break;
        case 3:
            Sixten(L,q);
            break;
        case 0:
            return 0;}
                break;}
            case 2:{
                Pipei(L);
                DestroyStack(L);
                break;
            }
            case 3:{

                wuban();
                break;
            }
            case 4:
                yinhang();
                break;
            case 5:
                int a;
                printf("请输入求阶乘的数字:\n");
                scanf("%d",&a);
                printf("%d\n",digui(a));
                break;

    }}




}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值