其他分享
首页 > 其他分享> > 数据结构·练习·运算符号的合法性判断

数据结构·练习·运算符号的合法性判断

作者:互联网

数据结构·练习·运算符号的合法性判断

一、问题描述
一串至多包含加减乘除四则运算的算式,判断其运算符号使用情况是否符合规范。
二、算法概述

1、问题分析

1、问题抽象与分类

2、算法描述

  1. 定义变量;
  2. 获取输入数据,并为之分配空间;
  3. 排查算符多出的情况;
  4. 排查括号左多的情况;
  5. 排查括号右多的情况;
  6. 结果输出。

三、输入说明
任意输入一串至多包含加减乘除四则运算的算式。
四、输出说明
使用合法则输出“运算符号使用合法”;
算符多出则输出“算符多出!”;
括号左多则输出“左括号多出!”;
括号右多则输出“右括号多出!”;

输入样例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