C语言栈实现四则运算

说明:本代码旨在帮助实现遇到困难的低年级学生或非计算机相关专业学生借鉴,是借鉴,不是抄袭,我强烈建议你自己先实现一遍。这是我一个非计算机专业的同学和我一起完成的。这是我通过栈实现的,代码质量简洁性效率性还是很好的,逻辑清晰(相对初学者,我认为),bug基本改完了,至少我找到的都改了。如有更好的方式欢迎指出。

补充:如果正是大一的你,你想实现功能更强大的计算器,比如用QT实现不仅仅四则运算的,可以在大二参考我另外的一篇博客。

当然等你学数值分析之后,如果想把里面的算法怎么解决方程实现一次,也可以参考我的另外的博客。

// bds_qz.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#define n 50
#pragma warning(disable:4996)
typedef struct
{
	char a[n];
	int size;//表示栈中含有的元素数量
} stack;
char pop(stack *p)
{
	if (p->size == 0)
		printf("空栈");
	else
	{
		--(p->size);
		return p->a[p->size];
	}
}
char top(stack *p)
{
	if (p->size == 0)
		return '/0';//抛出/0字符代表空
	else
	{
		return p->a[p->size - 1];
	}
}
int empty(stack *p)
{
	return p->size == 0;
}
void push(stack *p, char b)
{
	p->a[p->size] = b;
	++p->size;
}
int compare(char a)//用于比较优先级
{
	int i;
	switch (a)
	{
	case '+':
		i = 1;
		break;
	case '-':
		i = 1;
		break;
	case '*':
		i = 2;
		break;
	case '/':
		i = 2;
		break;
	default:
		i = 0;
		break;
	}
	return i;
}
void merge(float *a, float b, char c)//用于将两数字合并,注意前面的数字传地址
{
	if (c == '-')
	{
		(*a) -= b;
	}
	else if (c == '+')
	{
		(*a) += b;
	}
	else if (c == '*')
	{
		(*a) *= b;
	}
	else
		(*a) /= b;
}
void qiuzhi(char *bds)
{
	int i = 0;
	stack *ysf = (stack*)malloc(sizeof(stack));//为表达式开辟一个stack
	ysf->size = 0;
	float num[50];//用于求值的数组
	int numpos = 0;//用于求值的数组位置//ps因为num这个栈用的操作非常的少,而stack没有泛化,所以没有采用栈
	printf("后缀表达式为:");
	while (bds[i] != '=')
	{
		if (bds[i] == '\0')
		{
			printf("表达式应该有=");
			return;
		}
		if (bds[i] <= '9'&&bds[i] >= '0')//为数字的情况,转换为1个数,如234
		{
			num[++numpos] = 0;
			while (bds[i] <= '9'&&bds[i] >= '0')
			{
				num[numpos] *= 10;
				num[numpos] += (bds[i] - '0');
				++i;
			}
			if (bds[i] == '.')
			{
				double f_car = 0.1;//定义基数
				++i;
				while (bds[i] <= '9'&&bds[i] >= '0')
				{
					num[numpos] += ((bds[i] - '0')*f_car);
					f_car *= 0.1;
					++i;
				}
			}//计算小数点
		}
		else
		{
			if (empty(ysf))
				push(ysf, bds[i]);
			else
			{
				if (bds[i] == '(')
					push(ysf, bds[i]);
				else if (bds[i] == ')')
				{
					while (top(ysf) != '(')
					{
						merge(&num[numpos - 1], num[numpos], top(ysf));
						printf("%c", pop(ysf));
						--numpos;
					}
					pop(ysf);//弹出右括号
				}
				else
				{
					while (compare(bds[i])<=compare(top(ysf)))
					{
						merge(&num[numpos - 1], num[numpos], top(ysf));
						printf("%c", pop(ysf));
						--numpos;
					}
					push(ysf, bds[i]);
				}
			}
			++i;
		}
	}
	while (!empty(ysf))
	{
		merge(&num[numpos - 1], num[numpos], top(ysf));
		printf("%c", pop(ysf));
		--numpos;
	}
	printf("\n运算结果为:%.2f\n", num[1]);
}
int main()
{
	stack *p;
	char bds[50];
	scanf("%s", bds);
	qiuzhi(bds);
	return 0;
}

示例:

  • 18
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
是一种可以进行后进先出(Last In First Out,LIFO)操作的数据结构,可以用来实现四则运算的求值。以下是使用C语言实现实现四则运算的示例代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 typedef struct { int top; int data[MAX_SIZE]; } Stack; // 初始化 void init(Stack *s) { s->top = -1; } // 判断是否为空 int is_empty(Stack *s) { return s->top == -1; } // 判断是否已满 int is_full(Stack *s) { return s->top == MAX_SIZE - 1; } // 入操作 void push(Stack *s, int val) { if (is_full(s)) { printf("Stack overflow\n"); exit(1); } s->data[++s->top] = val; } // 出操作 int pop(Stack *s) { if (is_empty(s)) { printf("Stack underflow\n"); exit(1); } return s->data[s->top--]; } // 获取顶元素 int top(Stack *s) { if (is_empty(s)) { printf("Stack underflow\n"); exit(1); } return s->data[s->top]; } // 判断字符是否为数字 int is_digit(char c) { return c >= '0' && c <= '9'; } // 计算两个数的结果 int calculate(int a, int b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: printf("Invalid operator\n"); exit(1); } } // 计算表达式的值 int evaluate(char *expr) { Stack operand_stack, operator_stack; init(&operand_stack); init(&operator_stack); while (*expr != '\0') { if (is_digit(*expr)) { int num = 0; while (is_digit(*expr)) { num = num * 10 + (*expr - '0'); expr++; } push(&operand_stack, num); } else if (*expr == '(') { push(&operator_stack, '('); expr++; } else if (*expr == ')') { while (top(&operator_stack) != '(') { char op = pop(&operator_stack); int b = pop(&operand_stack); int a = pop(&operand_stack); int result = calculate(a, b, op); push(&operand_stack, result); } pop(&operator_stack); expr++; } else if (*expr == '+' || *expr == '-') { while (!is_empty(&operator_stack) && top(&operator_stack) != '(') { char op = pop(&operator_stack); int b = pop(&operand_stack); int a = pop(&operand_stack); int result = calculate(a, b, op); push(&operand_stack, result); } push(&operator_stack, *expr); expr++; } else if (*expr == '*' || *expr == '/') { while (!is_empty(&operator_stack) && (top(&operator_stack) == '*' || top(&operator_stack) == '/')) { char op = pop(&operator_stack); int b = pop(&operand_stack); int a = pop(&operand_stack); int result = calculate(a, b, op); push(&operand_stack, result); } push(&operator_stack, *expr); expr++; } else { printf("Invalid character\n"); exit(1); } } while (!is_empty(&operator_stack)) { char op = pop(&operator_stack); int b = pop(&operand_stack); int a = pop(&operand_stack); int result = calculate(a, b, op); push(&operand_stack, result); } return top(&operand_stack); } int main() { char expr[MAX_SIZE]; printf("Enter an expression: "); scanf("%s", expr); int result = evaluate(expr); printf("Result: %d\n", result); return 0; } ``` 在以上代码中,我们使用了两个实现四则运算的求值。其中,`operand_stack` 用于存储操作数,`operator_stack` 用于存储运算符。具体的求值过程如下: 1. 从左到右遍历表达式的每个字符。 2. 如果字符是数字,则将其解析为整数,并将其压入 `operand_stack` 中。 3. 如果字符是左括号,则将其压入 `operator_stack` 中。 4. 如果字符是右括号,则不断弹出 `operator_stack` 的顶元素,直到遇到左括号为止。对于每个弹出的运算符,都从 `operand_stack` 中弹出两个操作数进行计算,将结果压入 `operand_stack` 中。 5. 如果字符是加号或减号,则不断弹出 `operator_stack` 的顶元素,直到遇到左括号或空为止。对于每个弹出的运算符,都从 `operand_stack` 中弹出两个操作数进行计算,将结果压入 `operand_stack` 中。最后将当前字符压入 `operator_stack` 中。 6. 如果字符是乘号或除号,则不断弹出 `operator_stack` 的顶元素,直到遇到加号、减号、左括号或空为止。对于每个弹出的运算符,都从 `operand_stack` 中弹出两个操作数进行计算,将结果压入 `operand_stack` 中。最后将当前字符压入 `operator_stack` 中。 7. 如果字符不是数字、左括号、右括号、加号、减号、乘号或除号,则报错并退出程序。 8. 遍历完整个表达式后,不断弹出 `operator_stack` 的顶元素,直到空为止。对于每个弹出的运算符,都从 `operand_stack` 中弹出两个操作数进行计算,将结果压入 `operand_stack` 中。 9. 最后,`operand_stack` 中剩下的唯一元素就是表达式的值。 以上就是使用实现四则运算的示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值