cy51161952 发表于 2007-7-5 23:38

求助 括号匹配问题源代码

<P>括号匹配问题&lt;在vc++环境&gt;<BR>问假设一个算术表达式种可包含三种括号:<BR>圆括号,方括号和花括号且三种括号可按任意次序嵌套使用.<BR>试利用栈的运算编写判别给定表达中所含括号是否正确匹配对出现的算法,并能指示出错的位置.<BR></P>
<P>请高手帮帮忙啊!下星期就交了.[em08]</P>

guoxiaogang 发表于 2007-7-6 14:51

<P>typedef char SElemType;<BR>#include&lt;string.h&gt;<BR> #include&lt;ctype.h&gt;<BR> #include&lt;malloc.h&gt; /* malloc()等 */<BR> #include&lt;limits.h&gt; /* INT_MAX等 */<BR> #include&lt;stdio.h&gt; /* EOF(=^Z或F6),NULL */<BR> #include&lt;stdlib.h&gt; /* atoi() */<BR> #include&lt;io.h&gt; /* eof() */<BR> #include&lt;math.h&gt; /* floor(),ceil(),abs() */<BR> #include&lt;process.h&gt; /* exit() */<BR> #define TRUE 1<BR> #define FALSE 0<BR> #define OK 1<BR> #define ERROR 0<BR> #define INFEASIBLE -1<BR> /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */<BR> typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */<BR> typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */<BR> #define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */<BR> #define STACK_INCREMENT 2 /* 存储空间分配增量 */<BR> typedef struct SqStack<BR> {<BR>   SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */<BR>   SElemType *top; /* 栈顶指针 */<BR>   int stacksize; /* 当前已分配的存储空间,以元素为单位 */<BR> }SqStack; /* 顺序栈 */<BR>void InitStack(SqStack *S)<BR> { /* 构造一个空栈S */<BR>   (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));<BR>   if(!(*S).base)<BR>     exit(OVERFLOW); /* 存储分配失败 */<BR>   (*S).top=(*S).base;<BR>   (*S).stacksize=STACK_INIT_SIZE;<BR> }</P>
<P> void DestroyStack(SqStack *S)<BR> { /* 销毁栈S,S不再存在 */<BR>   free((*S).base);<BR>   (*S).base=NULL;<BR>   (*S).top=NULL;<BR>   (*S).stacksize=0;<BR> }</P>
<P> void ClearStack(SqStack *S)<BR> { /* 把S置为空栈 */<BR>   (*S).top=(*S).base;<BR> }</P>
<P> Status StackEmpty(SqStack S)<BR> { /* 若栈S为空栈,则返回TRUE,否则返回FALSE */<BR>   if(S.top==S.base)<BR>     return TRUE;<BR>   else<BR>     return FALSE;<BR> }</P>
<P> int StackLength(SqStack S)<BR> { /* 返回S的元素个数,即栈的长度 */<BR>   return S.top-S.base;<BR> }</P>
<P> Status GetTop(SqStack S,SElemType *e)<BR> { /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */<BR>   if(S.top&gt;S.base)<BR>   {<BR>     *e=*(S.top-1);<BR>     return OK;<BR>   }<BR>   else<BR>     return ERROR;<BR> }</P>
<P> void Push(SqStack *S,SElemType e)<BR> { /* 插入元素e为新的栈顶元素 */<BR>   if((*S).top-(*S).base&gt;=(*S).stacksize) /* 栈满,追加存储空间 */<BR>   {<BR>     (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACK_INCREMENT)*sizeof(SElemType));<BR>     if(!(*S).base)<BR>       exit(OVERFLOW); /* 存储分配失败 */<BR>     (*S).top=(*S).base+(*S).stacksize;<BR>     (*S).stacksize+=STACK_INCREMENT;<BR>   }<BR>   *((*S).top)++=e;<BR> }</P>
<P> Status Pop(SqStack *S,SElemType *e)<BR> { /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */<BR>   if((*S).top==(*S).base)<BR>     return ERROR;<BR>   *e=*--(*S).top;<BR>   return OK;<BR> }</P>
<P> void StackTraverse(SqStack S,void(*visit)(SElemType))<BR> { /* 从栈底到栈顶依次对栈中每个元素调用函数visit() */<BR>   while(S.top&gt;S.base)<BR>     visit(*S.base++);<BR>   printf("\n");<BR> }<BR> void check()<BR> { /* 对于输入的任意一个字符串,检验括号是否配对 */<BR>   SqStack s;<BR>   SElemType ch[80],*p,e;<BR>   InitStack(&amp;s); /* 初始化栈成功 */<BR>   printf("Please putinto your(()、[]和{})biaodashi\n");<BR>   gets(ch);<BR>   p=ch; /* p指向字符串的首字符 */<BR>   while(*p) /* 没到串尾 */<BR>     switch(*p)<BR>     {<BR>       case '(':<BR>       case '[':<BR>       case '{':Push(&amp;s,*p++); /* 左括号入栈,且p++ */<BR>                break;<BR>       case ')':<BR>       case ']':<BR>       case '}':if(!StackEmpty(s)) /* 栈不空 */<BR>                {<BR>                  Pop(&amp;s,&amp;e); /* 弹出栈顶元素 */<BR>                  if(!(e=='('&amp;&amp;*p==')'||e=='['&amp;&amp;*p==']'||e=='{'&amp;&amp;*p=='}'))<BR>                  { /* 出现3种匹配情况之外的情况 */<BR>                    printf("left kuohao!=right\n");<BR>                    exit(ERROR);<BR>                  }<BR>                }<BR>                else /* 栈空 */<BR>                {<BR>                  printf("lose left's kuohao\n");<BR>                  exit(ERROR);<BR>                }<BR>       default: p++; /* 其它字符不处理,指针向后移 */<BR>     }<BR>   if(StackEmpty(s)) /* 字符串结束时栈空 */<BR>     printf("right!\n");<BR>   else<BR>     printf("Sorry,it's wrong!\n");<BR> }</P>
<P> void main()<BR> {<BR>   check();<BR> }</P>

mjh_abc 发表于 2007-7-7 08:31

ai,这简单的东西也要别人编

cy51161952 发表于 2007-7-8 22:56

<P>有没有用vc++做的?<BR>我急啊!</P>

guoxiaogang 发表于 2007-8-15 23:28

对不起啊,我只学了C语言.不会C++,我想只是细节上的问题.你改一下.

页: [1]

编程论坛