表达式求值和括号匹配(栈的应用)
  JVvkXf0ZfMJV 2023年11月02日 15 0

括号匹配

//括号的匹配
int matching()
{
	Stack s;
	InitStack(s);
	int flag = 1;
	char ch[10] = "[(]]#";
	//读入
	//cin >> ch;
	int i = 0;
	while (ch[i] != '#' && flag != 0)//假设字符串以#结尾
	{
		if (ch [i] == '(' || ch[i] == '[')
		{
			PushbackStack(s, ch[i]);//入栈 
		}
		if (ch[i] == ')' || ch[i] == ']')
		{
			if (IsEmpty(s))
			{
				flag = 0;
				break;
			}
			//判断是否匹配并将栈顶元素出栈
			ElemType tmp = StackTop(s);
			flag = ISMatch(tmp, ch[i]);
		}
		i++;
		//读入下一个字符
		//cin >> ch;
	}
	//如果栈空且flag=1,则匹配成功
	if (IsEmpty(s) && flag == 1)
		return OK;
	return ERROR;
}
int ISMatch(char tmp,char ch)
{
	if ((tmp == '(' && ch == ')') || (tmp == '[' && ch == ']'))
		return OK;
	else
		return ERROR;
}

表达式求值

原理:

表达式求值和括号匹配(栈的应用)_栈

表达式求值和括号匹配(栈的应用)_栈_02

图片来自《数据结构》严蔚敏 李冬梅 吴伟民 编著

【算法描述】

//优先级比较>——1,<——-1,=——0,
char PriorityComparison(char c1, char ch)
{
	char s[7] = { '+','-','*','/','(',')','#' };
	//s[0]-》+
	int Priority[7][7] =
	{ {1,1,-1,-1,-1,1,1},
	{1,1,-1,-1,-1,1,1},
	{1,1,1,1,-1,1,1},
	{1,1,1,1,-1,1,1},
	{-1,-1,-1,-1,-1,0,3},
	{1,1,1,1,3,1,1},
	{-1,-1,-1,-1,-1,3,0}
	};
	int i = 0;
	for (; i < 7; i++)
	{
		if (s[i] == c1)
			break;
	}
	int j = 0;
	for (; j< 7; j++)
	{
		if (s[j] == ch)
			break;
	}
	int flag = Priority[i][j];
	if (flag == 1)
		return '>';
	else if (flag == 0)
		return '=';
	else if (flag == -1)
		return '<';
	/*else 
		*/;
}
//计算
int calculating(int num1, char s, int num2)
{
	switch (s)
	{
	case'+':
		return num1 + num2;
	case'-':
		return num1 - num2;
	case'*':
		return num1 * num2;
	case'/':
		return num1 / num2;
	}
}
//表达式求值
char EvaluateExpression()
{
	//OPTR:存放符号,OPND:存放数字
	Stack OPTR, OPND;
	//int ch;
	char ch;
	InitStack(OPTR);
	InitStack(OPND);
	//先把'#'入栈
	cin >> ch;
	PushbackStack(OPTR, ch);
	cin >> ch;
	while (ch!='#'||StackTop(OPTR)!='#')
	{
		if (isdigit(ch))
		{
			PushbackStack(OPND, ch-48);//将字符转为数字,如果是ch,结果为-1
			cin >> ch;
		}
		else
		{
			//PushbackStack(OPTR, ch);
			//获取栈顶元素并比较
			char c1 = StackTop(OPTR);
			char c = PriorityComparison(c1, ch);
			switch (c)
			{
			case'>':
				//弹出两个数字
				//int b = Popback(OPND);
				//int a = Popback(OPND);
				c1=Popback(OPTR);//符号出栈
				PushbackStack(OPND, calculating(Popback(OPND),
					c1, Popback(OPND)));//计算结果并入栈
				break;
			case'<':
				PushbackStack(OPTR, ch);
				cin >> ch;
				break;
			case'=':
				//弹出栈顶的‘(’
				Popback(OPTR);
				cin >> ch;
				break;
			}

		}
	}

	return (int)StackTop(OPND);
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

JVvkXf0ZfMJV