利用栈来完成表达式求值

利用栈来完成表达式求值

一个表达式要求值,分为操作数部分和运算符部分,求值的过程便是运算符对操作数进行操作。
首先我们定义两个栈,一个栈存放运算符,先放个#进去,代表开始,然后记得结束最后一个字符也是#,这样代表结束。然后建立一个栈存放操作数。
算法:
定义一个字符来getchar字符,然后判断。首先判断这是字符是不是#或者现在运算符栈的top是不是#,如果两个都是#那么运算完成。
然后判断,不是运算符的话就存入操作数栈内
如果是运算符,那么判断,这个运算符与现在运算符栈top位置的运算符的关系,两者的优先性,根据优先性来进行下一步操作
比如top位置是‘-‘,然后字符是‘)’,那么在运算符栈内肯定有一个“(”与字符‘)’对应,如果没有,那么肯定输入有问题。因为有’(‘在栈内所以‘-’的优先性是大于‘)’的,获得字符‘>’所以进行运算,也就是减。首先从操作数里面取top出来,作为减数,然后top–,然后再取top作为被减数,因为存放顺序的关系,先进去的肯定是在前面。然后在字符“>”的情况下是不进行getchar的,因为也就进行了运算,所以现在字符还是‘)’,然后现在运算符栈内的就是‘(’,如果不是,那么继续运算,因为可能出现(7+2+2)这种,那么多算一次‘>’的情况就行。然后(与)判断结果是=,让运算符栈内(消掉,然后现在括号内的运算已经完毕,然后getchar获取下一个字符,继续进行判断!

代码可以直接运行

#include"consts.h"

typedef struct {
   
	char S[100];
	int top;
}CHARStack;

void InitStack(CHARStack *S) {
   
     S->top = -1;
}
void Push(CHARStack* S, char ch) {
   
	if (S->top >= 99) {
   
		printf("栈满!\n");
		exit(0);
	}
	else {
   
		S->top++;
		S->S[S->top] = ch;
	}
}
char GetTop(CHARStack* S) {
   
	if (S->top==-1) {
   
		printf("栈空!\n");
		exit(0);
	}
	else {
   
		
		return S->S[S->top];
	}
}

int TRIn(char ch) {
                              //是运算符就返回1,不是运算符返回0
	if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '#') {
   
		return 1;
	}
	else return 0;
}


char Precede(char ch1, char ch2) {
   
	if (ch1 == '+') {
   
		if (ch2 == '+')return '>';
		if (ch2 == '-')return '>';
		if (ch2 == '*')return '<';
		if (ch2 == '/')return '<';
		if (ch2 == '(')return '<';
		if (ch2 == ')')return '>';
		if (ch2 == '#')return '>';
	}
	else if 
好的,我可以回答这个问题。利用C数组模拟完成后缀表达式求值的步骤如下: 1. 定义一个数组作为,同时定义一个变量作为顶指针。 2. 从左到右扫描后缀表达式,遇到操作数时,将其压入中。 3. 遇到操作符时,弹出顶的两个元素,进行相应的计算,并将结果压入中。 4. 重复执行步骤2和3,直到扫描完整个表达式。 5. 最终,中只剩下一个元素,就是后缀表达式的计算结果。 代码示例: ``` #include<stdio.h> #include<string.h> #define MAXSIZE 100 float stack[MAXSIZE]; // 定义数组 int top = -1; // 定义顶指针 // 将元素压入中 void push(float item){ if (top == MAXSIZE-1){ printf("Stack Overflow\n"); return; } stack[++top] = item; } // 弹出顶元素 float pop(){ if (top == -1){ printf("Stack Underflow\n"); return -1; } return stack[top--]; } // 判断是否为操作符 int isOperator(char ch){ if (ch == '+' || ch == '-' || ch == '*' || ch == '/'){ return 1; } return 0; } // 计算后缀表达式 float evaluatePostfix(char postfix[]){ int len = strlen(postfix); for (int i = 0; i < len; i++){ char ch = postfix[i]; if (isOperator(ch)){ float op2 = pop(); float op1 = pop(); switch(ch){ case '+': push(op1 + op2); break; case '-': push(op1 - op2); break; case '*': push(op1 * op2); break; case '/': push(op1 / op2); break; } } else if (ch >= '0' && ch <= '9'){ push(ch - '0'); } } return stack[top]; } int main(){ // 后缀表达式 "23*6+" char postfix[] = "23*6+"; float result = evaluatePostfix(postfix); printf("Result = %f\n", result); return 0; } ``` 以上就是利用C数组模拟完成后缀表达式求值的过程和对应的代码实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值