1. 程式人生 > 其它 >C. Longest Simple Cycle 線性DP

C. Longest Simple Cycle 線性DP

技術標籤:演算法佇列演算法java

文章目錄


前言

沒想到吧,我皮某人又回來了。
經過這麼久的偷懶,哦不,沉澱,於2021年1月18號迴歸寫部落格的日子。回想那段日子,彷彿就這昨天


別bb了,快上點東西吧

最近會定期更新資料結構方面的內容以及相應的演算法題,等到後期會更新JavaWeb,以及框架方面的知識,作為一隻剛飛的菜鳥,需要各路大神為我的部落格提出改正,一定第一時間修改,三克油~~


就這?

gogogo整活


提示:以下是本篇文章正文內容,下面案例可供參考

一、佇列是什麼?

佇列是一種特殊的線性表…

線性表又是啥
在這裡插入圖片描述
線性表是最基本、最簡單、也是最常用的一種資料結構。線性表(linear list)是資料結構的一種,一個線性表是n個具有相同特性的資料元素的有限序列。

有限序列是什麼?

在這裡插入圖片描述

有限序列是指序列中的元素個數是有限的,即序列的長度是有限的。在數學上,序列是被排成一列的物件(或事件);這樣每個元素不是在其他元素之前,就是在其他元素之後。序列可以是有限的,有限序列包含空序列( ),它沒有元素。序列中的元素也稱為項,項的個數稱為序列的長度。

聽不懂…

就是一堆數排成一列!別說了,這不是重點。

二、佇列裡面要知道的概念

1.出列

齊步走,121,121,1234

停停停,什麼玩意。
這裡的出列是在佇列的首部刪除。
說白了就是把你剛才那一堆數的第一個數給刪了,這個數就出列了。

2.入列

入列的意思就和出列的意思相反,
在佇列的尾部進行插入操作就叫做入列

3.空佇列

空佇列就是沒有元素

沒有元素就沒有元素唄,還搞個空佇列。
好聽不行?槓精出門左拐

上例題

可能純概念大家理解不是很好,那我們來玩一個解密遊戲。
規則是這樣的:首先將第一個數刪除,緊接著將第二個數放到這串數的末尾,在將第三個數刪除並將第四個放到這串數的末尾。以此類推,將最後一個數也刪除。按照刪除的順序,把這些順序連在一起就是密碼。(來自**《啊哈!演算法》**)
是不是很懵逼,那這樣,應該就好看一些了
原數字串8 5 4 6 3 6 4 2 6 9
首先將第一個數刪除,緊接著將第二個數放到這串數的末尾
4 6 3 6 4 2 6 9 58退5
3 6 4 2 6 9 5 64退6
4 2 6 9 5 6 63退6
6 9 5 6 6 24退2
5 6 6 2 96退9
6 2 9 65退6
9 6 26退2
2 69退6
62退66

輸出:8 4 3 4 6 5 6 9 2 6
這麼看是不是理解規則了?
那還不碼起來???

先給出C語言的部分程式碼

while(head < tail)
   {
       //輸出隊首
       printf("%d\t",a[head]);
        //出列
       head++;
        //將新對首入列
       a[tail] = a[head];
        
       tail++;
       //在將隊首出列
       head++;
   }

這樣一看是不是頓時就明白了???

什麼?不明白?

不明白好好琢磨琢磨

Java/C程式碼

C語言程式碼

#include <stdio.h>

struct queue{

    int a[101];
    int head;
    int tail;
};

int main()
{
    struct queue q;
    int i;
    q.head = 1;
    q.tail = 1;
    //初始化佇列
    for(i = 1;i<=10;i++)
    {
        scanf("%d",&q.a[q.tail]);
        q.tail++;
    }


    while(q.head < q.tail)
    {
        printf("%d\t",q.a[q.head]);

        q.head++;

        q.a[q.tail] = q.a[q.head];

        q.tail++;

        q.head++;
    }
}

Java程式碼

package queue;

import java.util.Scanner;

public class test01 {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int [] a = new int[101];

        /**
         * head:指向隊首
         * tail:指向隊尾
         */
        int head = 1,tail = 1;

        for (int i = 1; i <= 10; i++) {
            a[tail] = scanner.nextInt();
            tail++;
        }

        while (head < tail){
            System.out.println(a[head] + "  ");
            head++;
            a[tail] = a[head];
            tail++;
            head++;
        }

    }
}



完美收官