棧的創建等操作及使用案例(檢測括號匹配)

棧的特點很明顯,先進後出,使用數組便可實現。

該特點對於編程來說是非常有幫助的,近期遇到的幾個題目都有棧的思想。下面是其中一個簡單的題目:
檢測字符串中的括號“()”是否匹配,不匹配的情況有:
1、左括號“(”和右括號“)”的總個數不相等。
2、先出現右括號”)”。

思路:若檢測到左括號,則入棧;檢測到右括號則出棧。並時刻檢查棧的標記index是否爲負,一旦爲負則說明右括號先出現,立刻返回錯誤標誌。遍歷完字符串之後,判斷index是否爲零,即左右括號數是否相等。


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXSIZE 100
#define ERROR -1
#define OK 0

typedef int type_t;

//棧的結構體
typedef struct
{
    type_t data[MAXSIZE];  //棧數據存儲區
    int index;  //棧標記
}Stack;

//創建棧
Stack *stack_create()
{
    Stack *s = (Stack *)malloc(sizeof(Stack));
    s->index = 0;
    return s;
}

//銷燬棧
void stack_destroy(Stack *s)
{
    if(s != NULL)
        free(s);
    return;
}

//壓棧
int push(Stack *s, type_t data)
{
    if(s->index == MAXSIZE)
        return ERROR;
    else
    {
        s->data[s->index] = data;
        s->index++;
        return OK;
    }
}

int pop(Stack *s, type_t *pData)
{
    if(s->index == 0)
    {
        return ERROR;
    }
    else
    {
        s->index--;
        *pData = s->data[s->index];
        return OK;
    }
}

//棧頂減一
void pop_null(Stack *s)
{
    if(s != NULL)
        s->index--;
}

//檢測字符串中括號“()”是否匹配
//匹配    返回OK
//不匹配   返回ERROR
int check(const char *str)
{
    Stack *s = stack_create();
    int len = strlen(str);
    int i;
    for(i = 0; i < len; i++)
    {
        if(s->index < 0)
        {
            stack_destroy(s);
            return ERROR;
        }
        if(str[i] == '(')
        {
            push(s, 1);
        }
        if(str[i] == ')')
        {
            pop_null(s);
        }
    }
    stack_destroy(s);

    if(s->index == 0)
        return OK;
    else
        return ERROR;
}

//待檢測字符串
const char *str = "((unsigned long)&(((type_t*)0)->member))";

int main()
{
    Stack *s = stack_create();

    if(check(str) == OK)
        printf("OK!\n");
    else
        printf("ERROR!\n");

    return 0;
}
發佈了43 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章