C语言学习记录(11)逆波兰表示法

C语言学习记录

前言

一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流!

不当之处请斧正!在此感谢!这边就先从学习C语言写起,自己本身对程序语言方面不擅长,所以决定对此从基础开始学习,

大牛们对此文可以忽略!

学校OJ上的题目

逆波兰表示法

题目描述
有些计算器使用逆波兰表示法来书写数学表达式。在这一表示法中,运算符放置在操作数的后面而不是放置在操作数中间。例如:在逆波兰表示法中1+2将表示为1 2 +,而1+23将表示为1 2 3 * +。

逆波兰表达式可以很方便地用栈求值。算法从左向右读取运算符和操作数,并执行下列步骤:

(1)当遇到操作数时,将其压入栈中。

(2)当遇到运算符时,从栈中弹出它的操作数,执行运算并把结果压入栈中。

编写程序对逆波兰表达式求值。操作数都是个位的整数,运算符为+、-、
、/和=。

输入描述
在一行中输入逆波兰表达式。保证操作数都是个位的整数,运算符为+、-、、/和=。

输出描述
输出所求的值。

输入样例
123
+=
输出样例
7

解题: 用数组代替栈。
ps:他的输入样例真是一点用都没有。你可能要试试563+*3/1-=

#include <stdio.h>
#include <string.h>

void reverse(char a[]);

int main(int argc, char *argv[]) {
	char s[100];
	gets(s);
	reverse(s);
	return 0;
}

void reverse(char a[])
{
	int b[100],i,lenB=-1;
	
	for( i=0; i<=strlen(a); i++ )
	{
		if( a[i]>='0' && a[i]<='9' )
		{
			lenB++;
			b[lenB] = (int)a[i]-48;
		}
		else
		{
			switch( a[i] )
			{
				case '+': b[lenB-1] = b[lenB-1] + b[lenB]; lenB--; break;
				case '-': b[lenB-1] = b[lenB-1] - b[lenB]; lenB--; break;
				case '*': b[lenB-1] = b[lenB-1] * b[lenB]; lenB--; break;
				case '/': b[lenB-1] = b[lenB-1] / b[lenB]; lenB--; break;
				case '=': printf("%d",b[lenB]);
			}
		}
	}
}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
波兰表示是一种将运算符放在操作数之后的表示。使用波兰表示可以避免使用括号,同时计算机可以直接根据波兰表示进行计算,无需进行语分析。 例如,算术表达式 2 + 3 * 4 的波兰表示为 2 3 4 * + ,表示先计算 3 * 4,再将结果与 2 相加。 下面是一个计算波兰表示的c语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX_STACK_SIZE 100 int stack[MAX_STACK_SIZE]; int top = -1; void push(int value) { if (top >= MAX_STACK_SIZE - 1) { printf("Error: stack overflow\n"); exit(EXIT_FAILURE); } stack[++top] = value; } int pop() { if (top < 0) { printf("Error: stack underflow\n"); exit(EXIT_FAILURE); } return stack[top--]; } int evaluate(char* expression) { char* p = expression; while (*p != '\0') { if (isdigit(*p)) { push(atoi(p)); while (isdigit(*p)) ++p; } else if (*p == '+') { int right = pop(); int left = pop(); push(left + right); ++p; } else if (*p == '-') { int right = pop(); int left = pop(); push(left - right); ++p; } else if (*p == '*') { int right = pop(); int left = pop(); push(left * right); ++p; } else if (*p == '/') { int right = pop(); int left = pop(); push(left / right); ++p; } else { ++p; } } return pop(); } int main() { char expression[] = "2 3 4 * +"; int result = evaluate(expression); printf("Result: %d\n", result); return 0; } ``` 在上面的代码中,我们使用一个栈来存储操作数。对于每个字符,如果它是数字,则将它转换为整数并压入栈中;如果它是运算符,则从栈中弹出两个操作数进行计算,并将结果压回栈中。最后,栈中剩下的元素就是计算结果。 需要注意的是,在计算除时需要检查被除数是否为0,否则会出现除以0的运行时错误。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值