棧的特點很明顯,先進後出,使用數組便可實現。
該特點對於編程來說是非常有幫助的,近期遇到的幾個題目都有棧的思想。下面是其中一個簡單的題目:
檢測字符串中的括號“()”是否匹配,不匹配的情況有:
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;
}