栈的特点很明显,先进后出,使用数组便可实现。
该特点对于编程来说是非常有帮助的,近期遇到的几个题目都有栈的思想。下面是其中一个简单的题目:
检测字符串中的括号“()”是否匹配,不匹配的情况有:
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;
}