关于一个用栈来检查表达式的括号匹不匹配的代码,其中表达式中括号有三种:(),[]和{}
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 200
typedef struct
{
char * base;
char * top;
}stack;
int Init(stack *s)
{s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s->base) return 0;
s->top=s->base;
return 1;
}
void Destroy(stack *s)
{free(s->base);
s->base=NULL;
s->top=NULL;
}
void Push(stack *s,char c)
{
*s->top++=c;
}
int pop(stack *s,char *c)
{if(s->top==s->base) return 0;
*c=*--s->top;
return 1;
}
/*---------------------------------------------------------------*/
int Check(stack *s,char *expr)
{int i;
char c[1];
for(i=0;expr[i]!='\0';i++)
{if(expr[i]=='{'||expr[i]=='['||expr[i]=='(') Push(s,expr[i]);
if(expr[i]=='}'||expr[i]==']'||expr[i]==')')
{
if(pop(s,c)==0) return 0;/*栈空,表达式有错*/
else
{if(expr[i]==')')
{
if(c[0]!='(') return 0;
}
else
if(expr[i]-c[0]!=2) return 0;/*'{'和'}'式'['和']'的ASCII码差2*/
}
}
}
if(s->base!=s->top)
return 0;
return 1;
}
/*-------------------------------------------------------------*/
void main()
{
char expr[100];
stack *s;
printf("input the expression\n");
scanf("%s",expr);
if(!Init(s))//第一句warning
exit(0);
if(Check(s,expr))//第二句warning
printf("right\n");
else
printf("wrong\n");
Destroy(s);//第三句warning
}
-----------------------------
程序运行正确,不过有三个warning(即main中用到s的地方都有一个相同的warning:"possible use "s" before definition")这是什么原因呢?我不是已经在stack *s这一句定义s吗?
#include <stdlib.h>
#define STACK_INIT_SIZE 200
typedef struct
{
char * base;
char * top;
}stack;
int Init(stack *s)
{s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s->base) return 0;
s->top=s->base;
return 1;
}
void Destroy(stack *s)
{free(s->base);
s->base=NULL;
s->top=NULL;
}
void Push(stack *s,char c)
{
*s->top++=c;
}
int pop(stack *s,char *c)
{if(s->top==s->base) return 0;
*c=*--s->top;
return 1;
}
/*---------------------------------------------------------------*/
int Check(stack *s,char *expr)
{int i;
char c[1];
for(i=0;expr[i]!='\0';i++)
{if(expr[i]=='{'||expr[i]=='['||expr[i]=='(') Push(s,expr[i]);
if(expr[i]=='}'||expr[i]==']'||expr[i]==')')
{
if(pop(s,c)==0) return 0;/*栈空,表达式有错*/
else
{if(expr[i]==')')
{
if(c[0]!='(') return 0;
}
else
if(expr[i]-c[0]!=2) return 0;/*'{'和'}'式'['和']'的ASCII码差2*/
}
}
}
if(s->base!=s->top)
return 0;
return 1;
}
/*-------------------------------------------------------------*/
void main()
{
char expr[100];
stack *s;
printf("input the expression\n");
scanf("%s",expr);
if(!Init(s))//第一句warning
exit(0);
if(Check(s,expr))//第二句warning
printf("right\n");
else
printf("wrong\n");
Destroy(s);//第三句warning
}
-----------------------------
程序运行正确,不过有三个warning(即main中用到s的地方都有一个相同的warning:"possible use "s" before definition")这是什么原因呢?我不是已经在stack *s这一句定义s吗?
...全文
相关推荐
用顺序栈判断表达式中括号是否匹配正确
在编程和计算机科学中,表达式中的括号匹配是一个重要的问题,它涉及到数据结构和算法的应用。本问题来源于《数据结构,算法及应用》一书,作者Zhang Xianchao,具体是P80页的第13题。
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
`g` 是全局标志,表示匹配所有出现,而不仅仅是第一个。2. **中括号** - `[]` 正则表达式:`/\[(.+?)
正则表达式去除中括号(符号)及里面包含的内容
正则表达式是一种强大的文本处理工具,常用于匹配、查找、替换和提取字符串中的特定模式。在本主题中,我们将探讨如何使用正则表达式去除中括号(包括方括号`[`和`]`)以及它们内部包含的内容。
正则表达式(括号)、[中括号]、{大括号}的区别小结
"正则表达式中的括号()、中括号[]和大括号{}在不同的场景下具有不同的含义和功能。理解这些基础知识对于掌握正则表达式至关重要。"正则表达式是用于匹配字符串的强大工具,其中的括号、中括号和大括号
数据结构判断表达式3种括号匹配
在遍历表达式时,遇到每一个字符,如果它是开启的括号,就将其压入栈;如果遇到关闭的括号,我们就检查栈顶元素是否是对应开启的括号,如果是,则弹出栈顶元素,表示成功匹配;如果不是,或者栈为空,那么表达式就是不正确的


