判断圆括号是不是配对用C语言如何实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断圆括号是不是配对用C语言如何实现相关的知识,希望对你有一定的参考价值。
这是数据结构中栈的应用问题。判断一个算术表达式的圆括号是否正确配对。我想要的是C语言代码。
1、设计原理:
主要是利用了栈的结构,在表达式的输入过程中实现对括号是否匹配的判断。根据其括号的原则:小括号之中不能含有大括号或中括号,中括号中不能含有大括号。再由紧密性,左边括号和右边括号是紧密相连的。否则判断为错。 其操作为:每输入一个字符打一下回车,若输入括号顺序错误则跳出,并显示错误!
2、例程:
#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) 是不是括号都是不是配对正确了