首页 > 其他分享 >初级数据结构--栈在表达式求职中的应用2

初级数据结构--栈在表达式求职中的应用2

时间:2023-06-07 22:31:47浏览次数:41  
标签:p2 p1 -- top expp ++ ator 求职 数据结构

只支持正确格式表达式,判断非法表达式逻辑没写太多

纯个人理解,指套入了部分表达式测试,如有错误欢迎指出

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
typedef struct Operand
{
	int and[MAX_SIZE];
	int top;
}Operand;
typedef struct Operator
{
	int top;
	char ator[MAX_SIZE];
}Operator;

//初始化两个栈
void Init_Oper(Operand *p1, Operator *p2)
{
	int i = 0;
	for (i = 0; i < MAX_SIZE; i++)
	{
		p1->and[i] = 0;
		p2->ator[i] = 0;
	}
	p1->top = 0;
	p2->top = 0;
}
//计算
bool Ifator(char c)
{
	switch (c)
	{
	case '+':
	case '-':
	case '*':
	case '/':
	case '(':
	case ')':
		return  true;
	default:
		return false;
	}
}
int Calculate(char ator,int x,int y)
{
	switch (ator)
	{
	case '+':
		return x + y;
		break;
	case '-':
		return x - y;
		break;
	case '*':
		return x*y;
		break;
	case '/':
		return x / y;
		break;
	default:
		break;
	}
}
void Out(Operand *p1, Operator *p2)
{
	int ret = 0;
	ret = Calculate(p2->ator[p2->top - 1],
		p1->and[p1->top - 2],
		p1->and[p1->top - 1]);
	p1->and[p1->top - 2] = ret;
	p1->and[p1->top - 1] = 0;
	p1->top--;
	p2->ator[p2->top - 1] = 0;
	p2->top--;
}
bool GetAnswer(Operand *p1, Operator *p2, char *expp)
{
	bool bracket = false;
	while (*expp || (p2->top&&p1->top!=1))
	{
		int n = 0;
		if (isdigit(*expp))//压入操作数
		{
			while (*expp&&isdigit(*expp))
			{
				n = n * 10 + *expp-'0';//char型数字需要循环记录完整操作数
				expp++;
			}
			p1->and[p1->top] = n;
			p1->top++;
		}
		else if (Ifator(*expp))//压入操作符 || *expp == '(' || *expp == ')'
		{
			if (bracket)
			{
				p2->ator[p2->top] = *expp;
				p2->top++;
				expp++;
				bracket = false;
			}

			if (0 == p2->top&&*expp!=')')
			{
				p2->ator[p2->top] = *expp;
				p2->top++;
				expp++;
			}
			else
			{
				if (*expp == '('||p2->ator[p2->top-1]=='(')
				{
					p2->ator[p2->top] = *expp;
					p2->top++;
					expp++;
					if(*expp == '(')
						bracket=true;
				}
				if (*expp == ')')
				{
					while (p2->ator[p2->top - 1] != '(')
					{
						if (!(p2->top))
						{
							Init_Oper(p1, p2);//非法表达式返回false并清空两个栈
							return false;
						}
						Out(p1, p2);
					}
					p2->ator[p2->top-1] = 0;
					p2->top--;
					expp++;
				}
				if (*expp == '+' || *expp == '-')//下一个运算符为+ - 出栈
				{
					Out(p1, p2);
				}
				else if (*expp == '*' || *expp == '/')
				{
					//+ - 压栈
					if (p2->ator[p2->top - 1] == '+' || p2->ator[p2->top - 1] == '-')
					{
						p2->ator[p2->top] = *expp;
						p2->top++;
						expp++;
					}
					// * / 出栈
					else if (p2->ator[p2->top - 1] == '*' || p2->ator[p2->top - 1] == '/')
					{
						Out(p1, p2);
					}
				}
			}
			//expp++;
		}
		else if (!(*expp)&&p2->top)
		{
			Out(p1, p2);
		}
		else
			return false;
	}
	if (1==(p1->top - 1) && !(p2->top - 1))
		return true;
	else
		return false;
}
int main()
{
	Operand oand;
	Operator oator;
	char exp[] = "(1+2*1)*3+2*2*2";//17
	Init_Oper(&oand, &oator);
	GetAnswer(&oand, &oator, exp);
	printf("%s\n%d\n", exp, oand.and[oand.top-1]);
	system("pause");
	return 0;
}


标签:p2,p1,--,top,expp,++,ator,求职,数据结构
From: https://blog.51cto.com/u_16071993/6436002

相关文章

  • HDU - 2473 (并查集+设立虚父节点(马甲))
    涉及到并查集的删除操作,比较复杂,可以利用虚设父节点的方法:例如:有n个节点,进行m次操作.首先将0~n-1的节点的父节点设置为i+n,n~2n+1的节点的父节点设置为本身,有m次操作,所以要用到m个虚节点,例如0,1,2,3,4,5的父节点为7,8,9,10,11,把他们插入2的集合,所以他们的根节点都为8,当把2从集合......
  • spring-boot-starter-validation数据校验
    依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency> beanimportboot.annotation.Status;importlombok.AllArgsConstructor;import......
  • 在线上项目添加索引
    在MySQL中,我们经常需要对数据进行查询、统计等操作,而索引是数据库优化的重要手段。加了索引的表能够更快速地执行查询操作,同时能够减少查询的开销,提高系统的吞吐率。那么,如何在线上加索引呢?首先,我们需要了解业务场景,明确需要加索引的表和字段,然后考虑索引类型。通常来说,MySQL支......
  • CC3链子分析
    <1>环境分析前两条CC1和CC6利用invoke反射调用Runtime().getRuntime().exec()执行命令很多时候服务器的代码当中的黑名单会选择禁用RuntimeCC3是利用类加载机制,动态加载恶意类来实现自动执行恶意类代码的这里测试环境为:jdk:jdk8u65CC:Commons-Collections3.2.1<2>链子分......
  • 13_How to Deploy NodeJs app on Ubuntu in Production
     地址:https://www.codewithharry.com/blogpost/deploy-nodejs-app-on-ubuntu/ HowtodeployaNode.jsapplicationinproductionInthispost,wewillseehowtorunanddeployNodeJSappsinproduction.Followthestepsbelow:Step1-InstallNodejsLet�......
  • Shell脚本
    Shell脚本Shell是什么?Shell脚本语言属于弱类型语言,解析用户输入的命令和程序,使得用户可以与Linux进行交互;适合处理纯文本类型数据(日志、配置文件、文本、网页文件、大多数纯文本类型的文件)。Shell概念shebang即文件的第一行前两个字符#!,后面的语句指定命令的解析器。......
  • 12_How to deploy Flask apps on Ubuntu VPS Using gunicorn and Ngnix
      地址:https://www.codewithharry.com/blogpost/flask-app-deploy-using-gunicorn-nginx/ HowtodeployflaskapponUbuntuVPSusingNginxandgunicornInthispost,wewillseehowtodeployflaskapplicationsusinggunicornWSGIserverandnginxasarev......
  • 「Solution Set」06/07
    P6109[Ynoi2009]rprmq1矩形加,矩形求和。但是修改都在查询前面。trick:如果是矩形加并且没有时间的区别,可以将以为当作时间。相当于在一段时间内将序列的一段区间加。然后可以转化为在序列的一段先加上,过一会再减掉。查询可以看作在一段时间上所有时刻的区间最大值。可以转化......
  • 力扣---2336. 无限集中的最小数字
    现有一个包含所有正整数的集合[1,2,3,4,5,...]。实现SmallestInfiniteSet类:SmallestInfiniteSet()初始化SmallestInfiniteSet对象以包含所有正整数。intpopSmallest()移除并返回该无限集中的最小整数。voidaddBack(intnum)如果正整数num不存在于无限集中......
  • python读txt文档-多列
    有一个txt格式的文本文档,格式如下。有两行数据。3个字段,字段与字段直接使用tab键分割开。hello1world1hellothankyou1hello2world2hellothankyou2现在想通过python读取这个文件。分别读取到hello1,world1,和 hellothankyou1代码如下。withopen('......