1. 程式人生 > >資料結構與演算法 -- 棧的應用(進位制轉換、括號匹配)

資料結構與演算法 -- 棧的應用(進位制轉換、括號匹配)

棧的應用

ps:用棧很簡單實現的應用有很多,比如說進位制轉換,括號匹配等。學計算機的都知道,2進位制,8進位制,10進位制,16進位制等,進位制之間的轉換也是需要掌握的,以備不時之需,所以我們可以自己寫一段程式如果會android的話,可以直接打包成APK。下面就按照這兩個應用稍微寫一點C語言的程式碼。

  • 進位制轉換
  • 括號匹配

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方法用到了尾插法。

/**
 * 進棧操作
 * */
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:括號匹配

什麼是括號匹配?

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

思路:

我們可以從鍵盤錄入字元,通過空格分開,在如果是左邊括號( { ),就入棧,如果是右邊括號( } )就出棧進行比較,看是否輸入一對括號,如果匹配,就進行下一個比較,否則return,就沒有再比較的必要了。因為上面有棧的入棧和出棧,這裡就不在給出,使用上面即可.

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

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;
}