判断圆括号是不是配对用C语言如何实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断圆括号是不是配对用C语言如何实现相关的知识,希望对你有一定的参考价值。

这是数据结构中栈的应用问题。判断一个算术表达式的圆括号是否正确配对。我想要的是C语言代码。

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);
 

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

#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; /* 相当于遇到右括号时弹栈 */

if (0 > num)

printf ("括号不匹配\n");
return 0;



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

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

else

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


return 0;
参考技术B 1、设计原理:
主要是利用了栈的结构,在表达式的输入过程中实现对括号是否匹配的判断。根据其括号的原则:小括号之中不能含有大括号或中括号,中括号中不能含有大括号。再由紧密性,左边括号和右边括号是紧密相连的。否则判断为错。
其操作为:每输入一个字符打一下回车,若输入括号顺序错误则跳出,并显示错误!
2、例程:
#include
#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);
参考技术C 这样的问题论坛里一大堆,都懒成这样啦。

在Java中,设计一个算法,判断一个算术表达式中的括号是不是配对。

还需要分别指出哪个左括号与哪个右括号对应??

参考技术A 算法:
String str="5+(4-3))" 表达式
char kuohao[]; 用作括号堆栈
扫描str中的字符
1如果是(则入栈
2如果是)
a如果战不空出栈
b如果栈空,不匹配。算法结束
最后栈空则匹配

下面是我的实现

public class biaodashi

public static void main(String args[])

int top=0;//堆指针
boolean end=true;//不匹配时只输出一次

char stack[]=new char[100];//存括号

String biaoda="(((1+(2)-6))";//表达式
char biao[]=biaoda.toCharArray();//将字符串转化成字符数组
System.out.println("表达式: "+biaoda);

for(int i=0;i<biao.length&&end;i++)//遍历表达式中所有字符

if(biao[i]=='(')//如果是(则入栈

stack[top]='(';
top++;

else if(biao[i]==')')//如果是)则出战

if(!(top==0))
top--;
else

System.out.println("括号不匹配");
end=false;




//除循环两种可能

if(top==0&&end)
System.out.println("括号匹配");//出循环stack空
else if(top!=0&&end)
System.out.println("括号不匹配");//出循环时stack不空



追问

如果只是看括号是否匹配,我建议用StringBuffer来做更简单。呵呵

追答

我也是刚学java不久,你不只是看括号匹配。那还有什么要求

追问

要求指出每一个左括号所对应的右括号

本回答被提问者采纳
参考技术B http://reallyafei.javaeye.com/blog/347736 参考技术C stack 用栈就可以 参考技术D 迭代字符串的每个字符,算一下(的数量和)的数量是不是一样的就行了呗追问

需要指出哪个左括号与哪个右括号对应

追答

没那么麻烦吧。。先判断左右数量是否一致,左边第二个和右边第二个肯定是对应的啊。。

追问

如果括号提出来是这样呢:
(()())(()()())

追答

如果是(,向右继续找(,看有几个(,就找第几+1个)
右括号同理

以上是关于判断圆括号是不是配对用C语言如何实现的主要内容,如果未能解决你的问题,请参考以下文章

写一个正则,java的,需要匹配多个括号,如判断 11(22(234)(as(fds) 是不是括号都是不是配对正确了

试编写一个算法从检查一个Java语言中的大括号方括号小括号是不是配对,若能够全?

[PTA][C语言][数据结构]判断表达式中括号是否匹配

求c语言高手,括号配对问题

c语言中如何判断输入的是不是数字?

C语言中,怎样判断一个数组中是不是有重复元素呢?最好用程序实现