數據結構與算法 -- 棧的應用(進制轉換、括號匹配)

棧的應用

ps:用棧很簡單實現的應用有不少,好比說進制轉換,括號匹配等。學計算機的都知道,2進制,8進制,10進制,16進制等,進制之間的轉換也是須要掌握的,以備不時之需,因此咱們能夠本身寫一段程序若是會android的話,能夠直接打包成APK。下面就按照這兩個應用稍微寫一點C語言的代碼。android

  • 進制轉換
  • 括號匹配

1:進制轉換

  想要本身作一個進制轉換的工具,首先咱們要知道如何實現進制之間的轉換,咱們日常用的都是10進制,若是想要轉成8進制怎麼辦,按照方法,如圖算法

能夠看到,N是咱們輸入的10進制數,除以8,餘數保留在棧中,獲得的168接着與8整除運算,直到N div 8  等於0,最後把棧中數據取出便可,正好用到了棧的規則,先進後出的特性。工具

1.1:定義棧結構體

typedef struct zhan{
    int data;
    struct zhan *next;
}zhan,*ZhanL;

 1.2:初始化棧

/**
 * 初始化棧
 * */
ZhanL initZhan(){
    ZhanL L =(ZhanL)malloc(sizeof(zhan));
    L->next=NULL;
    return L;
}

1.3進棧出棧操做

在pop方法中,把L賦給s,主要是出棧後,把空餘的棧位釋放掉,push方法用到了尾插法。spa

/**
 * 進棧操做
 * */
int push(ZhanL &L,int data){
    //建立一個新的結點
    ZhanL p=(ZhanL)malloc(sizeof(zhan));
    p->data=data;
    p->next = L;
    L = p;
    return 0;
}
int pop(ZhanL &L){
    if(L->next){
        ZhanL s=L;//釋放空間用
        printf("%d ",s->data);
        L = L->next;
        if(L->next){
//            printf("棧頂%d \n",L->data);
        } else{
            printf("棧空\n");
        }
        free(s);
    }
    return 0;
}

1.4:轉換方法

/**
 * 轉換方法
 * */
 int zhuanhuan(ZhanL &L,int data,int jz){
     while (data){
         push(L,data%jz);
         data = data/jz;
     }

     while (L){
         pop(L);
     }
    return 0;
 }

1.5:使用

int main(){
    ZhanL L;
    L=initZhan();
    printf("請輸入一個十進制數");
    int data,jz;
    scanf("%d",&data);
    printf("請輸入轉換的進制");
    scanf("%d",&jz);
    zhuanhuan(L,data,jz);
    return 0;
}

結果圖:

2:括號匹配

什麼是括號匹配?code

在編寫代碼的時候,常常會用到兩種括號:圓括號 「()」 和大括號 「{}」 。無論使用哪一種括號,程序編譯沒有問題的其中一個重要因素就是所使用的括號是否可以匹配上.
在編寫程序時,括號能夠嵌套,即: 「({()})」 這種形式,但 「({)」 或者 「({}」 都不符合要求。blog

思路:

咱們能夠從鍵盤錄入字符,經過空格分開,在若是是左邊括號( { ),就入棧,若是是右邊括號( } )就出棧進行比較,看是否輸入一對括號,若是匹配,就進行下一個比較,不然return,就沒有再比較的必要了。由於上面有棧的入棧和出棧,這裏就不在給出,使用上面便可.get

注意:把上面結構體中int型,改爲char型。it

2.1:括號匹配算法

從控制檯正常輸入,空格隔開,碰見m結束,在輸入期間,檢測到左括號,進棧,右括號就要和和左括號比較,如何比較呢,咱們能夠把右括號翻轉,說白了就是碰見右括號就讓它變成指定的左括號形式,如:if(ch == '}')  這時就能夠把ch改爲  {  再和棧中元素進行比較。編譯

int main(){
    ZhanLink zhanLink;
    zhanLink = initLink();
    char ch;
    while(ch != 'm'){
        scanf("輸入%c  ",&ch);
        ch = getchar();
        switch (ch){
            case '{':
            case '(':
                push(zhanLink,ch);
                break;
            case '}':
            case ')':
//                printf("      %c\n",ch);
                char e=pop(zhanLink);

                if(ch == '}'){
                    ch='{';
                }else if(ch == ')'){
                    ch = '(';
                }
//                printf("修改後%c\n",ch);
                if(e == ch){
                    if(ch == '{'){
                        ch='}';
                    }else if(ch == '('){
                        ch = ')';
                    }
                    printf("匹配%c %c\n",e,ch);
                }else{
                    printf("括號不匹配\n");
                    return 0;
                }
                break;
        }
    }
    printf("匹配合理");

//    pop(zhanLink);

    return 0;
}

相關文章
相關標籤/搜索