数据结构·练习·运算符号的合法性判断
作者:互联网
数据结构·练习·运算符号的合法性判断
一、问题描述
一串至多包含加减乘除四则运算的算式,判断其运算符号使用情况是否符合规范。
二、算法概述
1、问题分析
1、问题抽象与分类
- 算符判断
多出 - 括号判断
左多
右多
2、算法描述
- 头文件引用库<stdio.h>,<stdlib.h>和<string.h>
- 前置函数(置空栈)(出栈)(入栈)
- 主函数程序:
- 定义变量;
- 获取输入数据,并为之分配空间;
- 排查算符多出的情况;
- 排查括号左多的情况;
- 排查括号右多的情况;
- 结果输出。
三、输入说明
任意输入一串至多包含加减乘除四则运算的算式。
四、输出说明
使用合法则输出“运算符号使用合法”;
算符多出则输出“算符多出!”;
括号左多则输出“左括号多出!”;
括号右多则输出“右括号多出!”;
输入样例1:
{[a+(b+c)]d-e}(f+g)
输出样例1:
运算符号使用合法
输入样例2:
{[a+b+c)]d-+e}(fg
输出样例2:
算符多出!
左括号多出!
右括号多出!
五、程序实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 100
typedef char datatype;
//定义节点
typedef struct
{
datatype data[M];
int Top;
}Stack;
Stack*S;
/*前置函数*/
//置空栈
Stack*SetStack(Stack*S)
{
S=(Stack*)malloc(sizeof(Stack));
S->Top=-1;
return S;
}
//进栈
Stack*PushS(Stack*S,datatype data)
{
if(S->Top==M-1)
{
printf("Stack Overflow\n");
return NULL;
}
else
{
S->Top++;
S->data[S->Top]=data;
}
return S;
}
//出栈
datatype*PopS(Stack*S)
{
datatype*ret;
if(S->Top==-1)
{
printf("Stack Underflow\n");
return NULL;
}
else
{
S->Top--;
ret=(datatype*)malloc(sizeof(datatype));
*ret=S->data[S->Top+1];
return ret;
}
}
/*主函数*/
int main()
{
Stack*S;
datatype str[M],*ret;
int i,L;
int a=1;
S=SetStack(S);
gets(str);
L=strlen(str);
//排查算符多出的情况
for(i=0;i<L-1;i++)
{
if((str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')&&(str[i+1]=='+'||str[i+1]=='-'||str[i+1]=='*'||str[i+1]=='/'))
{
printf("算符多出!\n");
a=0;
break;
}
}
if(str[L-1]=='+'||str[L-1]=='-'||str[L-1]=='*'||str[L-1]=='/')
{
printf("算符多出!\n");
a=0;
}
for(i=0;i<L;i++)
{
//遇到左括号入栈
if(str[i]=='{'||str[i]=='['||str[i]=='(')
{
S=PushS(S,str[i]);
}
//排查右括号多出的情况
//遇到右括号出栈比较
if(str[i]==')'||str[i]==']'||str[i]=='}')
{
ret=PopS(S);
if(str[i]==')'&&*ret!='('||str[i]==']'&&*ret!='['||str[i]=='}'&&*ret!='{')
{
S=PushS(S,*ret);
a=0;
}
continue;
}
}
if(a==0)
printf("右括号多出!\n");
//排查左括号多出的情况
if(S->Top!=-1)
{
printf("左括号多出!\n");
a=0;
}
if(a==1)
{
printf("运算符号使用合法\n");
}
return 0;
}
六、实践总结
认知归纳
解决问题首先要分析问题,抽象出问题对象,然后确定解决方案,处理数据结构问题时也即算法,其次据此实践。根据实际情况不断调整解决方案。
实际问题
只关注了各部分的功能实现,忽略了各部分之间的相互影响,导致了各种代码漏洞。
标签:合法性,运算,Top,ret,括号,str,多出,数据结构,Stack 来源: https://blog.csdn.net/zhoujianqing2020/article/details/121380761