Stack Problems and Queue Problems

·

3 min read

  1. Check Balanced parentheses using Stack

    hint
    當遇到左括號的話就push進堆疊裡,然後遇到右括號時,會跟堆疊裡top指標變數所指向的節點去比較,如果是相對應的左括號,就會把左括號pop出去
    solution
  2. Evaluate postfix expression

    hint
    當遇到的數字時就push進堆疊裡,而遇到運算子時,就把堆疊裡的兩個節點pop出來進行運算,最後在push回去
    solution
  3. Tracking present minimum element in a stack

    hint
    建立一個新的堆疊用來儲存最小值,當要加入的新節點小於最小堆疊裡的節點的話,就把該節點插入進堆疊裡,但是如果大於堆疊裡的節點的話,就重新插入最小堆疊裡一樣的值
    solution
  4. Reverse stack using another stack

    hint
    建立一個新的堆疊用於反轉,從原本的堆疊儲存top指向的節點之後,push進反轉的堆疊裡
    solution
  5. Stock Span Problem

    hint
    建立一個堆疊,並且預設插入0,陣列也是預設插入1。如果當目前的這個值比下一個節點小的話,就把堆疊裡的節點pop,這樣就知道下一個值是next greater element,並且把stockspan陣列相對應的位置加1,直到遇到比他小的值
    solution
  6. Find the next greater element on right side

    hint
    當堆疊裡的節點大於陣列裡的值,就把值push進堆疊裡,但如果堆疊裡的節點小於陣列的值的話,就可以知道陣列裡的值是next greater element,之後把堆疊裡的節點pop出去,最後如果堆疊裡還有節點,代表他沒有next greater element,所以就給-1然後pop出去
    solution
  7. Check if stack elements are pairwise consecutive

    hint
    建立first和second指標變數用來指向top的節點以及top->next的節點,然後比較second指標變數的值加1,如果不等於first指標變數的值,那就代表他們不是連續的
    solution
  8. Reverse a queue using stack

    hint
    把佇列的節點放在堆疊後再利用堆疊後進先出的特性來反轉佇列的節點
    solution
  9. Implement queue using stack

    hint
    為了讓堆疊模擬佇列的加入,就讓要加入的新節點先加入,之後再讓原本存在於佇列裡的節點加入,以符合佇列的先進先出。
    solution
  10. infix to postfix

    #include <stdio.h>
    #include <ctype.h>
    
    #define MAX 20
    
    void infixToPostfix(char[], int);
    int compare(char, char);
    
    char infixPriority[9] = { '#', ')', '+', '-', '*', '/', '^', ' ', '(' }; 
    char stackPriority[8] = { '#', '(', '+', '-', '*', '/', '^', ' ' };
    
    int main()
    {
        char infixQ[MAX];
        int rear = -1;
        printf("*********************************\n");
        printf("      -- Usable operator --\n");
        printf(" ^: Exponentiation\n");
        printf(" *: Multiply      /: Divide\n");
        printf(" +: Add           -: Subtraction\n");
        printf(" (: Left Brace    ): Right Brace\n");
        printf("*********************************\n");
        printf("Please enter infix expression: ");
        while (infixQ[rear] != '\n')
            infixQ[++rear] = getchar();
        infixQ[rear] = '#';
        printf("Postfix expression: ");
        infixToPostfix(infixQ, rear);
        printf("\n");
        return 0;
    }
    
    int compare(char stackO, char infixO)
    {
        int indexS = 0, indexI = 0;
        while (stackPriority[indexS] != stackO)
            indexS++;
        while (infixPriority[indexI] != infixO)
            indexI++;
        if ((stackO == '{' || stackO == '[') && (infixO == '}' || infixO == ']')) {
            return 0;
        }
        return indexS / 2 >= indexI / 2 ? 1 : 0;
    }
    
    void infixToPostfix(char infixQ[], int rear)
    {
        int top = 0, ctr;
        char stackT[MAX];
        stackT[top] = '#';
        for (ctr = 0; ctr <= rear; ctr++) {
            switch (infixQ[ctr]) {
            case ')':
                while (stackT[top] != '(')
                    printf("%c", stackT[top--]);
                top--;
                break;
            case '#':
                while (stackT[top] != '#')
                    printf("%c", stackT[top--]);
                break;
            case '(':
            case '^':
            case '*':
            case '/':
            case '+':
            case '-':
                while (compare(stackT[top], infixQ[ctr]))
                    printf("%c", stackT[top--]);
                stackT[++top] = infixQ[ctr];
                break;
            default:
                if (isalpha(infixQ[ctr]) || isdigit(infixQ[ctr])) {
                    printf("%c", infixQ[ctr]);
                }
                break;
            }
        }
    }
    
    solution
    在中序運算是佇列以及堆疊裡都存放著#符號,用來判斷是否已經到達了底端,接著通過判斷一個一個字元,來處理不一樣的事情,假如遇到右括號,就在堆疊裡尋找直到遇到左括號並彈出,如果遇到#就把堆疊裡剩下的運算子給彈出,但如果是遇到+、-、*、/、^,就先比較堆疊裡的優先權是否大於要加入的運算子的優先權,最後判斷是否為數字或字母就印出