编写程序,判断c语句中的圆括号是否配对

编写程序,判断c语句中的圆括号是否配对,第1张

1、设计原理:

主要是利用了栈的宏谨结构,在表达式的输入过程中实现对括号是否匹配的判断。根据其括号的原则:小括号之中不能含有大括号或中括号,中括号中不能含有大括号。再由紧密性,左边括号和右边括号是紧密相连的。否则判断为错。 其 *** 作为:每输入一个字符打一下回车,若输入括号顺序错误则跳出,并显示错误!

2、例程:

#include<stdio.h>

#define MAX 100

#define TRUE 1

#define FALSE 0

#define E a

typedef struct transition /*建立一个栈*/

{

char sq[MAX]

int top

}sqstack

sqstack bt

int emptysqstack(sqstack bt) /*判栈空*/

{

if(bt.top==-1)

return TRUE

else

return FALSE

}

void pushsqstack(sqstack bt,char sh) /*入栈庆信*/

{

if(bt.top==MAX-1)

{

printf("over flow")

exit(0)

}

bt.top++

bt.sq[bt.top]=sh

}

void popsqstack(sqstack bt) /*出栈*/

{

int sh

if(bt.top==-1)

{

printf("empty")

exit(0)

}

sh=bt.sq[bt.top]

bt.top--

return sh

}

Search(sqstack bt) /*查找括号是否匹配*/

{

char c=0

printf("If you want to break,please input 'a'\n")

while(c!=E&&bt.top<=MAX&&c!='('&&c!='['&&c!='{')

{

c=getchar()

pushsqstack(bt,c)

}

SearchA(bt,c)

SearchB(bt,c)

SearchC(bt,c)

}

SearchA(sqstack bt,char c) /*查找小括号是否匹配*/

{

if(c=='(')

{

while(c!=')'&&c!='['&&c!=']'&&c!='{'&&c!='}')

{

c=getchar()

pushsqstack(bt,c)

}

if(c=='(')

printf("right\n")

else if(c=='['||c==']'||c=='{'||c=='}')

printf("wrong\n")

}

}

SearchB(sqstack bt,char c) /*查找中括号是否匹配*/

{

if(c=='[')

while(c!=']'&&c!='('誉绝轮&&c!=')'&&c!='{'&&c!='}')

{

c=getchar()

pushsqstack(bt,c)

}

if(c==')'||c=='{'||c=='}')

printf("wrong\n")

else if(c=='(')

SearchA(bt,c)

else if(c==']')

printf("right\n")

else

printf("wrong\n")

}

SearchC(sqstack bt,char c) /*查找大括号是否匹配*/

{

if(c=='{')

while(c!='}'&&c!='['&&c!=']'&&c!='('&&c!=')')

{

c=getchar()

pushsqstack(bt,c)

}

if(c==']'||c==')')

printf("wrong\n")

else if(c=='[')

SearchB(bt,c)

else if(c=='(')

SearchA(bt,c)

else if(c=='}')

printf("right\n")

else

printf("wrong\n")

}

main()

{

int i

bt.top=-1

i=emptysqstack(bt)

if(i)

{

Search(bt)

}

else

exit(0)

}

如果只有圆括号(没有[ ] 或 { }),不需要构造一个栈。因为用栈实现时,栈里装的都是一模一样的左括号 '(' ,因此我们只需定义一塌掘个 整型变量 来记录 栈中元素的个数前衫岩 即可。具体代码如下:

#include <stdio.h>

int main (void)

{

char input = 0

int num = 0 /* 不用栈,只记录栈中元素的个数,初始化为0 */

while (1 == scanf ("%c", &input)) /* 读入字符串,每次读一个字符存入 input 中 */

{

if ('(' == input)

{

++num /* 相当于把左括号压栈 */

}

if (')' == input)

{

--num /* 相当于遇到右括号时d栈 */

}

if (0 >num)

{

printf ("括号不匹配\n")

return 0

}

}

if (0 == num) /* 读完字符串后判断“栈”是否慧御为空 */

{

printf ("括号匹配\n")

}

else

{

printf ("括号不匹配\n")

}

return 0

}

左括号和右括号的个数相等是必要条件,但不是充隐薯分条件。

用“栈”听上去高深。

其实把依次读入的括号用左灶早者括号1右括号2表示,存入一个数组。

统计左右括号总数是否相等。不相等则不配。

loop:

再依次循环找相睁猛邻两个数是否12,是则删去,在它后面的数组元素向左移2位,如果长度变零,则是配对的,如果找不到 12,长度不为零则不配。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8256706.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存