C语言:表达式括号匹配检验(压栈,出栈)

Python09

C语言:表达式括号匹配检验(压栈,出栈),第1张

算法提示:

1)凡出现左括弧,则进栈;

2)凡出现右括弧,首先检查栈是否空

若栈空,则表明该“右括弧”多余,

否则和栈顶元素比较,

若相匹配,则“左括弧出栈”

否则表明不匹配。

3)表达式检验结束时,

若栈空,则表明表达式中匹配正确,

否则表明“左括弧”有余。

头文件:(另存为SeqStack.h)

typedef

struct

{

DataType

stack[MaxStackSize]

int

top

}

SeqStack

void

StackInitiate(SeqStack

*S)

/*初始化顺序堆栈S*/

{

S->top

=

0

/*定义初始栈顶下标值*/

}

int

StackNotEmpty(SeqStack

S)

/*判顺序堆栈S非空否,非空则返回1,否则返回0*/

{

if(S.top

<=

0)

return

0

else

return

1

}

int

StackPush(SeqStack

*S,

DataType

x)

/*把数据元素值x压入顺序堆栈S,入栈成功则返回1,否则返回0

*/

{

if(S->top

>=

MaxStackSize)

{

printf("堆栈已满无法插入!

\n")

return

0

}

else

{

S->stack[S->top]

=

x

S->top

++

return

1

}

}

int

StackPop(SeqStack

*S,

DataType

*d)

/*弹出顺序堆栈S的栈顶数据元素值到参数d

,出栈成功则返回1,否则返回0*/

{

if(S->top

<=

0)

{

printf("堆栈已空无数据元素出栈!

\n")

return

0

}

else

{

S->top

--

*d

=

S->stack[S->top]

return

1

}

}

int

StackTop(SeqStack

S,

DataType

*d)

/*取顺序堆栈S的当前栈顶数据元素值到参数d

,成功则返回1,否则返回0*/

{

if(S.top

<=

0)

{

printf("堆栈已空!

\n")

return

0

}

else

{

*d

=

S.stack[S.top

-

1]

return

1

}

}

括号问题

#include

<string.h>

#include

<stdio.h>

#include

<stdlib.h>

#define

MaxStackSize

100

typedef

char

DataType

#include

"SeqStack.h"

void

ExpIsCorrect(char

exp[],

int

n)

//判断有n个字符的字符串exp左右括号是否配对正确

{

SeqStack

myStack

//定义链式堆栈

int

i

char

c

StackInitiate(&myStack)

for(i

=

0

i

<

n

i++)

{

if((exp[i]

==

'(')

||

(exp[i]

==

'[')

||

(exp[i]

==

'{'))

StackPush(&myStack,

exp[i])

//入栈

else

if(exp[i]

==

')'

&&

StackNotEmpty(myStack)

&&

StackTop(myStack,

&c)

&&

c

==

'(')

StackPop(&myStack,

&c)

//出栈

else

if(exp[i]

==

')'

&&

StackNotEmpty(myStack)

&&

StackTop(myStack,

&c)

&&

c

!=

'(')

{

printf("左右括号配对次序不正确!\n")

return

}

else

if(exp[i]

==

']'

&&

StackNotEmpty(myStack)

&&

StackTop(myStack,

&c)

&&

c

==

'[')

StackPop(&myStack,

&c)

//出栈

else

if(exp[i]

==

']'

&&

StackNotEmpty(myStack)

&&

StackTop(myStack,

&c)

&&

c

!=

'[')

{

printf("左右括号配对次序不正确!\n")

return

}

else

if(exp[i]

==

'}'

&&

StackNotEmpty(myStack)

&&

StackTop(myStack,

&c)

&&

c

==

'{')

StackPop(&myStack,

&c)

//出栈

else

if(exp[i]

==

'}'

&&

StackNotEmpty(myStack)

&&

StackTop(myStack,

&c)

&&

c

!=

'{')

{

printf("左右括号配对次序不正确!\n")

return

}

else

if(((exp[i]

==

')')

||

(exp[i]

==

']')

||

(exp[i]

==

'}'))

&&

!StackNotEmpty(myStack))

{

printf("右括号多于左括号!\n")

return

}

}

if(StackNotEmpty(myStack))

printf("左括号多于右括号!\n")

else

printf("左右括号匹配正确!\n")

}

void

main(void)

{

char

a[]

=

"(())abc{[)(]}"

//测试例子1。左右括号配对次序不正确

char

b[]

=

"(()))abc{[]}"

//测试例子2。右括号多于左括号

char

c[]

=

"(()()abc{[]}"

//测试例子3。左括号多于右括号

char

d[]

=

"(())abc{[]}"

//测试例子4。左右括号匹配正确

int

n1

=

strlen(a)

int

n2

=

strlen(b)

int

n3

=

strlen(c)

int

n4

=

strlen(d)

ExpIsCorrect(a,

n1)

ExpIsCorrect(b,

n2)

ExpIsCorrect(c,

n3)

ExpIsCorrect(d,

n4)

}

二者放于同一目录下即可

#include <stdio.h>

#include <string.h>

#define MaxSize 100

typedef char ElemType//定义数据类型

//定义顺序栈

typedef struct

{

ElemType data[MaxSize]//数据域

int top//栈顶指针

}SeqStack

//栈初始化

int InitStack(SeqStack *s)

{

s->top=-1//初始化栈顶,指向空

return 1

}

//入栈

int Push(SeqStack *s,ElemType x)

{

if (s->top == MaxSize -1 )

{

printf("栈已满,不能入栈.\n")

return 0

}

else

{

s->top++//栈顶指针上移

s->data[s->top] = x//数据元素入栈

}

return 1

}

//出栈

int Pop(SeqStack *s,ElemType *x)

{

if (s->top == -1)

{

printf("栈为空,不能出栈.\n")

return 0

}

else

{

*x=s->data[s->top]//取出栈顶元素值

s->top--//栈顶指针下移

}

return 1

}

//取栈顶值

int GetTop(SeqStack *s,ElemType *x)

{

if (s->top == -1)

{

printf("栈为空,不能取值.\n")

return 0

}

else

{

*x=s->data[s->top]//取出栈顶元素值

}

return 1

}

//判断栈是否为空

int IsEmpty(SeqStack *s)

{

if(s->top==-1)

return 1

return 0

}

int Check(char str[],int len)

{

int i

int flag=1//合法标志0-不合法 1-合法

int exist=0//小括号存在标志 0-不在 1-在

ElemType x

SeqStack s//栈s

//栈初始化

InitStack(&s)

for(i=0i<leni++)

{

if(str[i]=='{')//大括号{

{

if(IsEmpty(&s))//栈空,直接入栈

{

if(Push(&s,str[i])!=1)

{

flag=0

break

}

}

else//栈非空,判断合法性

{

if(GetTop(&s,&x)!=1)//取栈顶值

{

flag=0

break

}

if(x=='{' || x=='[' || x== '(')//如果是{,[或者(,非法

{

flag=0

break

}

else//否则入栈

{

if(Push(&s,str[i])!=1)

{

flag=0

break

}

}

}

}

else if(str[i]=='[')//方括号[

{

if(IsEmpty(&s))//栈空,直接入栈

{

if(Push(&s,str[i])!=1)

{

flag=0

break

}

}

else//栈非空,判断合法性

{

if(GetTop(&s,&x)!=1)//取栈顶值

{

flag=0

break

}

if(x=='[' || x== '(')//如果是[或者(,非法

{

flag=0

break

}

else//否则入栈

{

if(Push(&s,str[i])!=1)

{

flag=0

break

}

}

}

}

else if(str[i]=='(')//小括号(

{

//直接入栈

if(Push(&s,str[i])!=1)

{

flag=0

break

}

exist=1//小括号存在

}

else if(str[i]==')')//小括号)

{

if(Pop(&s,&x)!=1)

{

flag=0

break

}

if(x!='(')//如果出栈非(,非法

{

flag=0

break

}

}

else if(str[i]==']')//方括号]

{

if(Pop(&s,&x)!=1)

{

flag=0

break

}

if(x!='[')//如果出栈非[,非法

{

flag=0

break

}

if(exist==0)//小括号不存在,单独[],非法

{

flag=0

break

}

}

else if(str[i]=='}')//大括号}

{

if(Pop(&s,&x)!=1)

{

flag=0

break

}

if(x!='{')//如果出栈非{,非法

{

flag=0

break

}

if(exist==0)//小括号不存在,单独[],非法

{

flag=0

break

}

}

else//其它字符跳过

continue

}

if(!IsEmpty(&s))//循环完毕,栈非空,非法

flag=0

return flag

}

//主函数

int main(void)

{

char str[MaxSize]//录入字符串

int i,len

while(1)

{

printf("输入字符串\n")

gets(str)

len=strlen(str)

if(len>=MaxSize)//超过定义长度

return 1

if(Check(str,len)==1)

printf("匹配合法!\n")

else

printf("不合法\n")

printf("是否继续? 1-是,0否 :")

if(scanf("%d",&i)!=1 || i!=1)

break

fflush(stdin)

}

return 0

}