#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
const char* yunsf[6] = {"+","-","*","/","^","%"};
struct Expression{ //表达式结构体
char expre[6];
int length;
int logo; //0表示整数,1表示浮点数,2表示字符
};
struct Polish{
int int_num;
float float_num;
char calcu[4];
int calcu_length;
int logo; //0表示整数,1表示浮点数,2表示字符
};
char user_string [20]; //存储用户输入的中缀表达式
Polish struct_hou[20]; //存储逆波兰表达式
Expression lexical_expre[20]; //存储词法分析之后的结果
char omega_stack[20]; //分析栈
int omega_pointer; //分析栈的指针
int zhong_leng; //中缀表达式的长度
int length_lexical; //经词法分析之后的数组的长度
int hou_leng; //逆波兰表达式的长度
int float_flag = 0; //0表示没有输入小数,1表示输入小数
struct Polish result; //最终计算结果
bool input_string();
void translate();
void calculate();
void init();
void lexical_analysis();
int digitProcess(char buffer,int pointer);
int calcuProcess(char buffer,int pointer);
bool isDigit(char buffer);
bool isCalcu(char buffer);
void translate();
int string_to_int(char *str,int length);
float string_to_float(char *str,int length);
int main(){
bool input_correctly = false;
while(!input_correctly){
input_correctly = input_string();
}
init();
lexical_analysis();
translate();
printf("后缀表达式:");
for(int i = 0; i<hou_leng;i++){
if(struct_hou[i].logo==0 && struct_hou[i].int_num<0){
printf("%d - ",struct_hou[i].int_num*(-1));
}
else if(struct_hou[i].logo==0){
printf("%d ",struct_hou[i].int_num);
}
else if(struct_hou[i].logo==1){
printf("%.2f ",struct_hou[i].float_num);
}
else{
printf("%s ",struct_hou[i].calcu);
}
}
printf("\n");
calculate();
if(float_flag){
printf("计算结果:%.2f\n",result.float_num);
}
else{
printf("计算结果:%d\n",result.int_num);
}
}
void translate(){ //将中缀表达式转换为后缀
int struct_point = 0;
while(struct_point<length_lexical){ //当词法分析结果栈还有内容时
struct Expression expre_trans = lexical_expre[struct_point];
//omega_stack栈中只存储运算符
if(strcmp(expre_trans.expre,"(")==0){
//如果是左括号,直接入栈
omega_stack[++omega_pointer] = '(';
}
else if(strcmp(expre_trans.expre,")")==0){
//如果是右括号,则一直出栈,直到栈顶是左括号
while(omega_stack[omega_pointer]!='('){
struct_hou[hou_leng].calcu[struct_hou[hou_leng].calcu_length++] = omega_stack[omega_pointer];
hou_leng++;
omega_pointer--;
}
omega_pointer--;
}
else if(strcmp(expre_trans.expre,"^")==0){
omega_stack[++omega_pointer] = expre_trans.expre[0]; //如果是乘除取余符号,则expre_trans中的字符长度为1
}
else if(strcmp(expre_trans.expre,"*")==0 || strcmp(expre_trans.expre,"/")==0||strcmp(expre_trans.expre,"%")==0){
//如果是乘除符号和取余符号
//则把全部*/%符号都出栈(相当于:在左边的*/号的优先级比后面的*/的优先级高)
while(omega_stack[omega_pointer]=='*'||omega_stack[omega_pointer]=='/'||omega_stack[omega_pointer]=='%'||omega_stack[omega_pointer]=='^'){
struct_hou[hou_leng].calcu[struct_hou[hou_leng].calcu_length++] = omega_stack[omega_pointer];
hou_leng++;
omega_pointer--;
}
//将刚才的*/%号入栈
omega_stack[++omega_pointer] = expre_trans.expre[0]; //进栈
}
else if(strcmp(expre_trans.expre,"+")==0 || strcmp(expre_trans.expre,"-")==0){
//如果是加减符号
if(struct_point==0||(strcmp(lexical_expre[struct_point-1].expre,"(")==0)){
//如果正负号在第一位,则说明是单目运算符
//如果加减符号的前一个符号为(,则说明是单目运算符。
if(lexical_expre[struct_point+1].logo==0){ //如果下一个是整数
//如果是整数
struct_hou[hou_leng].int_num =0-string_to_int(lexical_expre[struct_point+1].expre,lexical_expre[struct_point+1].length);
struct_hou[hou_leng].logo = 0;
hou_leng++;
}
else if(lexical_expre[struct_point+1].logo==1){ //如果下一个是浮点数
//如果是浮点数
struct_hou[hou_leng].float_num =0-string_to_float(lexical_expre[struct_point+1].expre,lexical_expre[struct_point+1].length);
struct_hou[hou_leng].logo = 1;
hou_leng++;
}
else{
printf("格式输入错误!\n");
exit(0);
}
struct_point++;
}
else{
//由于该+-号的优先级最低,只比(高,因此使所有栈中的字符都出栈,直至符号为(
while(omega_pointer!=-1&&omega_stack[omega_pointer]!='('){
struct_hou[hou_leng].calcu[struct_hou[hou_leng].calcu_length++] = omega_stack[omega_pointer];
hou_leng++;
omega_pointer--;
}
//将新的加减符号入栈
omega_stack[++omega_pointer] = expre_trans.expre[0]; //如果是加减符号,则expre_trans中的字符长度为1
}
}
else{//非运算符
//说明是数字
if(expre_trans.logo==0){
//如果是整数
struct_hou[hou_leng].int_num = string_to_int(expre_trans.expre,expre_trans.length);
struct_hou[hou_leng].logo = 0;
hou_leng++;
}
else{
//如果是浮点数
struct_hou[hou_leng].float_num = string_to_float(expre_trans.expre,expre_trans.length);
struct_hou[hou_leng].logo = 1;
hou_leng++;
}
}
struct_point++;
}
while(omega_pointer!=-1){
//当表达式扫描完毕后, 假如omage分析栈还存在元素,就依次全部加入到Polish栈中。
if(omega_stack[omega_pointer]!='('){
struct_hou[hou_leng].calcu[struct_hou[hou_leng].calcu_length++] = omega_stack[omega_pointer];
hou_leng++;
}
else{
printf("输入的表达式错误!\n");
exit(0);
}
omega_pointer--;
}
}
void calculate(){ //计算后缀表达式
int struct_point = 0;
while(struct_point<hou_leng){ //当逆波兰结果数组中还有内容时
struct Polish polish = struct_hou[struct_point];
if (strcmp(polish.calcu,"+")==0){
//如果是加号
if(struct_hou[struct_point-1].logo==1&&struct_hou[struct_point-2].logo==1){
//如果都是浮点数
struct_hou[struct_point].float_num = struct_hou[struct_point-2].float_num+struct_hou[struct_point-1].float_num;
struct_hou[struct_point].logo=1;
}
//如果有一方是浮点数
else if(struct_hou[struct_point-1].logo==1&&struct_hou[struct_point-2].logo==0){
float temp = struct_hou[struct_point-2].int_num;
struct_hou[struct_point].float_num = struct_hou[struct_point-1].float_num+temp;
struct_hou[struct_point].logo=1;
}
else if(struct_hou[struct_point-1].logo==0&&struct_hou[struct_point-2].logo==1){
float temp = struct_hou[struct_point-1].int_num;
struct_hou[struct_point].float_num = temp + struct_hou[struct_point-2].float_num;
struct_hou[struct_point].logo=1;
}
else{
//如果都是整型
struct_hou[struct_point].int_num = struct_hou[struct_point-2].int_num+struct_hou[struct_point-1].int_num;
struct_hou[struct_point].logo=0;
}
}
else if (strcmp(polish.calcu,"-")==0){
if(struct_hou[struct_point-1].logo==1&&struct_hou[struct_point-2].logo==1){
//如果都是浮点数
struct_hou[struct_point].float_num = struct_hou[struct_point-2].float_num-struct_hou[struct_point-1].float_num;
struct_hou[struct_point].logo=1;
}
else if(struct_hou[struct_point-1].logo==1&&struct_hou[struct_point-2].logo==0){
//如果有一方是浮点数
float temp = struct_hou[struct_point-2].int_num;
struct_hou[struct_point].float_num = temp-struct_hou[struct_point-1].float_num;
struct_hou[struct_point].logo=1;
}
else if(struct_hou[struct_point-1].logo==0&&struct_hou[struct_point-2].logo==1){
float temp = struct_hou[struct_point-1].int_num;
struct_hou[struct_point].float_num = struct_hou[struct_point-2].float_num-temp;
struct_hou[struct_point].logo=1;
}
else{
//如果都是整型
struct_hou[struct_point].int_num = struct_hou[struct_point-2].int_num-struct_hou[struct_point-1].int_num;
struct_hou[struct_point].logo=0;
}
}
else if (strcmp(polish.calcu,"*")==0){
// printf("进入乘号页面!\n");
//如果是乘号
if(struct_hou[stru
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
逆波兰式(Reverse Polish Notation,RPN),也称为后缀表达式,是一种用于表示数学表达式的形式,其特点是操作符位于与之相关的操作数之后。相比传统的中缀表达式,逆波兰式更容易被计算机程序理解和处理。 通过这次实验,我实现了逆波兰式的产生及计算代码,并对逆波兰式的原理和实现有了更加深入的理解。 逆波兰式通过将操作符放在操作数的后面来表示数学运算的顺序,避免了使用括号来确定运算的优先级。在实现程序过程中,关键是使用栈辅助转换中缀表达式为后缀表达式。在遍历中缀表达式的过程中,当遇到操作数时,直接输出;当遇到操作符时,与栈顶操作符比较优先级,如果当前操作符优先级较低,则将栈顶操作符输出,直到栈为空或栈顶操作符优先级较低。最后,将当前操作符入栈。通过遍历后缀表达式数组,根据不同的操作符和操作数类型,进行相应的计算操作。这部分代码涉及到浮点数和整型的判断和处理,以及各种运算符的计算规则。 在实验过程中,我发现逆波兰式的产生和计算代码紧密相连,两者相互依赖。逆波兰式的产生为逆波兰式的计算提供了基础,而逆波兰式的计算则是对逆波兰式生成算法的验证和应用。通过编写这两部分代码,我能
资源推荐
资源详情
资源评论
收起资源包目录
逆波兰式的产生及计算.zip (2个子文件)
逆波兰式的产生及计算
实验三.cpp 15KB
实验三.exe 163KB
共 2 条
- 1
资源评论
SarPro
- 粉丝: 2w+
- 资源: 29
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功