编写程序检查该字符串的括号是否成对出现,而且不能交叉出现。
输入:
一个字符串,里边可能包含“()”、"{}"、“[]”三种括号,“#”结束
输出:
成功:代表括号成对出现并且嵌套正确
失败:未正确使用括号字符。
分析
用一个栈,就能解决该问题,左括号栈顶字符必须和第一个入栈的右括号字符匹配。
栈介绍:栈是一种特殊的线性表,仅能在线性表的一端操作。
栈的特性:后进先出(LIFO)
由于正在学数据结构,于是栈的定义与操作都是自己编写的,为了巩固概念
代码
#include<stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define STACK_INT_SIZE 100
#define STACKINCREMENT 10
#define bool int
#define true 1
#define false 0
#define TRUE 1
#define FALSE 0
#define SElemType char
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//------基本操作的函数原型说明------
bool InitStack(SqStack *S);
//构建一个空栈
bool DestroryStack(SqStack *S);
//销毁栈S S 不再存在
bool ClearStack(SqStack *S);
//让S 变成一个空栈
bool StackEmpty(SqStack *S);
//判断S是否为空栈 ,为空栈返回true 否则返回false
int StackLength(SqStack S);
//返回S的元素个数,及为S的长度
bool GetTop(SqStack S);
//若栈不为空,返回栈顶元素,并返回true 否则返回 false
bool Push(SqStack *S,SElemType e);
//插入元素 违心的栈顶元素
bool Pop(SqStack *S,SElemType *e);
//若栈不为空,则删除栈顶元素,用e返回其值,返回true, 否则返回false
bool StackTraverse(SqStack S,bool(*vist)());
//从栈底到栈顶依次对每一个元素visit(),一旦visit失败,则操作失败
//------基本操作的算法描述------
InitStack(SqStack *S)
{
S->base = (SElemType *)malloc(STACK_INT_SIZE*sizeof(SElemType));
if(!S->base) return 0;
S->top = S->base;
S->stacksize = STACK_INT_SIZE;
return 1;
}
GetTop(SqStack S)
{
if(S.top==S.base) return 0;
return *(S.top-1);
}
Push(SqStack *S,SElemType e)
{
if(S->top - S->base>=S->stacksize) //如果栈满 需要增加空间
{
S->base = (SElemType*)realloc(S->base, (S->stacksize + STACKINCREMENT)*sizeof(SElemType));
if(!S->base) return 0;
S->top = S->base + S->stacksize;
S->stacksize +=STACKINCREMENT;
}
*(S->top++)=e;
return 1;
}
Pop(SqStack *S,SElemType *e)
{
if(S->top==S->base) return 0;
*e = *(--S->top);
return 1;
}
int CheckChar(char c, char OP[])
{
int i;
for(i=0; i<3; i++)
if(c==OP[i])return i;
return 999;
}
int main()
{
SqStack OPTR;
InitStack(&OPTR);
Push(&OPTR,'#');
printf("输入括号以“#”结尾\n");
char c;
c=getchar();
int m=1; //判断最终是否完全匹配 完全匹配 值为1,否则为0
char OP1[] = {'[','(','{'};
char OP2[] = {']',')','}'};
while(c!='#')
{
if(CheckChar(c,OP1)<3)
{
Push(&OPTR,c);
c=getchar();
}
else
{
if(CheckChar(GetTop(OPTR),OP1)==CheckChar(c,OP2))
{
//printf(" -+ ");
Pop(&OPTR,&c);
c=getchar();
continue;
}
else
{
m=0;
break;
}
}
}
if(GetTop(OPTR)!=c)m=0;
if(m==1)printf("\n括号完全匹配!");
else printf("\n括号匹配失败!");
return 0;
}
遇到此类问题,但看了文章还是未解决,
评论或加 QQ:781378815