zoukankan      html  css  js  c++  java
  • 循环队列和链队列的实现

    指针学的好水啊。。为了加深了对指针的运用 循环队列用了指针 链队列用了引用,还有就是在一个地方卡了好久好久,20多个报错无法编译通过要不要这么狠哇。。。最后发现是case内定义了新的变量惹

    case里最好不要定义新的变量,否则会出现error:jump to case label,解决办法让case加上花括号或者变量的定义写在switch外边

    以下是测试代码,,

    头文件"130h.h"

    #include <bits/stdc++.h>
    #define N 10
    const int inf = 0x3f3f3f3f;
    struct node1
    {
        int f, r, *a, num;
    };
    
    struct node
    {
        int data;
        node *next;
    };
    struct node2
    {
        node *f, *r;
    };
    
    void menu();
    bool init1(node1 *&q);
    bool push1(node1 *q, int x);
    bool pop1(node1 *q);
    int front1(node1 *q);
    void visit1(node1 *q);
    bool init2(node2 &q);
    bool push2(node2 &q, int x);
    bool pop2(node2 &q);
    int front2(node2 q);
    void visit2(node2 q);
    View Code

    main.cpp

    #include "130h.h"
    using namespace std;
    
    int main()
    {
        int n, x, m, ans, i;
        node1 *q;
        node2 Q;
        while(1)
        {
            menu();
            puts("请输入操作, -1结束");
            cin>>m;
            if(m==-1) break;
            switch(m)
            {
            case 1:
                if(init1(q)) puts("初始化成功");
                else puts("初始化失败");
                break;
            case 2:
                puts("请输入入队个数");
                cin>>n;
                printf("请输入%d个元素
    ", n);
                for(i = 1; i <= n; i++)
                {
                    cin>>x;
                    if(!push1(q, x))
                    {
                        puts("队列已满!");
                        break;
                    }
                }
                if(i == n+1) puts("入队成功");
                break;
            case 3:
                puts("请输入出队个数");
                cin>>n;
                for(i = 1; i <= n; i++)
                {
                    if(!pop1(q))
                    {
                        puts("队列已空!");
                        break;
                    }
                }
                if(i == n+1) puts("出队成功");
                break;
            case 4:
                ans = front1(q);
                if(ans != inf) printf("队首元素为%d
    ", ans);
                else puts("队列为空");
                break;
            case 5:
                visit1(q);
                break;
            case 6:
                if(init2(Q)) puts("初始化成功");
                else puts("初始化失败");
                break;
            case 7:
                puts("请输入入队个数");
                cin>>n;
                printf("请输入%d个元素
    ", n);
                for(i = 1; i <= n; i++)
                {
                    cin>>x;
                    if(!push2(Q, x))
                    {
                        puts("队列已满!");
                        break;
                    }
                }
                if(i == n+1) puts("入队成功");
                break;
            case 8:
                puts("请输入出队个数");
                cin>>n;
                for(i = 1; i <= n; i++)
                {
                    if(!pop2(Q))
                    {
                        puts("队列已空!");
                        break;
                    }
                }
                if(i == n+1) puts("出队成功");
                break;
            case 9:
                ans = front2(Q);
                if(ans != inf) printf("队首元素为%d
    ", ans);
                else puts("队列为空");
                break;
            case 10:
                visit2(Q);
                break;
            }
        }
        return 0;
    }
    View Code

    function.cpp

    #include "130h.h"
    using namespace std;
    
    void menu()
    {
        puts("	1.初始化循环队列");
        puts("	2.循环入队");
        puts("	3.循环出队");
        puts("	4.弹出循队队首元素");
        puts("	5.遍历循环队列
    ");
        puts("	6.初始化链队列");
        puts("	7.链队入队");
        puts("	8.链队出队");
        puts("	9.弹出链队队首元素");
        puts("	10.遍历链队列
    ");
    }
    
    bool init1(node1 *&q)//初始化循环队列
    {
        q = (node1*)malloc(sizeof(node1));//指针q重新初始化需要引用才能对main产生影响
        q->a = (int*)malloc(N*sizeof(int));//指针q的指向发生变化不需要引用就能对main产生影响
        if(!q || !q->a) return 0;
        q->r = q->f = q->num = 0;
        return 1;
    }
    
    bool push1(node1 *q, int x)//循环入队
    {
        if(q->r == q->f && q->num == N)
            return 0;
        q->a[q->r] = x;
        q->r = (q->r+1)%N;
        q->num++;
        return 1;
    }
    
    bool pop1(node1 *q)//循环出队
    {
        if(q->r == q->f && !q->num)
            return 0;
        q->f = (q->f+1)%N;
        q->num--;
        return 1;
    }
    
    int front1(node1 *q)//弹出循队队首元素
    {
        if(q->r == q->f && !q->num)
            return inf;
        return q->a[q->f];
    }
    
    void visit1(node1 *q)//遍历循环队列
    {
        int p = q->f, n = q->num;
        if(!n) puts("队列为空");
        while(n)
        {
            printf("%d ", q->a[p]);
            p = (p+1) % N;
            n--;
        }
        cout<<endl;
    }
    
    bool init2(node2 &q)//初始化链队列
    {
        q.f = (node*)malloc(sizeof(node));
        if(!q.f) return 0;
        q.r = q.f;
        q.r->next = NULL;
        return 1;
    }
    
    bool push2(node2 &q, int x)//链队入队
    {
        node *p;
        p = (node*)malloc(sizeof(node));
        if(!p) return 0;
        p->data = x;
        p->next = q.r->next;
        q.r->next = p;
        q.r = p;
        return 1;
    }
    
    bool pop2(node2 &q)//链队出队
    {
        if(q.r == q.f) return 0;
        node *p;
        p = q.f;
        q.f = p->next;
        free(p);
        return 1;
    }
    
    int front2(node2 q)//弹出链队队首元素
    {
        if(q.f == q.r) return inf;
        return q.f->next->data;
    }
    
    void visit2(node2 q)//遍历链队列
    {
        node *p;
        p = q.f;
        if(p == q.r) puts("队列为空");
        while(p != q.r)
        {
            printf("%d ", p->next->data);
            p = p->next;
        }
        cout<<endl;
    }
    View Code
  • 相关阅读:
    HDU 5642 King's Order 动态规划
    HDU 5640 King's Cake GCD
    HDU 5641 King's Phone 模拟
    HDU 5299 Circles Game 博弈论 暴力
    HDU 5294 Tricks Device 网络流 最短路
    HDU 5289 Assignment rmq
    HDU 5288 OO’s Sequence 水题
    星际争霸 虚空之遗 人族5BB 操作流程
    Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列
    Codeforces Beta Round #3 C. Tic-tac-toe 模拟题
  • 原文地址:https://www.cnblogs.com/lesroad/p/8794265.html
Copyright © 2011-2022 走看看