标签:clu top cal 逆波兰表达式 lib fine div str 表达
逆波兰表达式(也称为后缀表达式) C 语言简单实现,(也称为后缀表达式)
本示例旨在展示逆波兰表达式原理,作简单的混合运算,不作容错处理也不保证结果,若混合运算字符串中有负数等,自行调试解决
列如计算: 20.5+(100-(3+2)*8)/(8-5) - 10
后缀表达式为:20.5 100 3 2 + 8 * - 8 5 - / 10 - +
C 语言代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CNT 1000
struct node{
float num;
char op;
};
struct node datas[CNT]; //后缀表达式栈
int data_top = -1; //栈顶索引
char ops[CNT]; //操作符栈
int op_top = -1; //栈顶索引
char nums[100]; //数字字符串
int num_top = -1; //栈顶索引
//数字入栈
void push_num(){
if(num_top > -1){
datas[++data_top].num = atof(nums);
datas[data_top].op = 0;
num_top = -1;
memset(nums, 0, sizeof(nums));
}
}
//中缀转后缀
void mtoe(const char* str){
char *tmp;
tmp = (char*)str;
while(*tmp != ‘\0‘){
char ch = *tmp;
++tmp;
if(ch == ‘ ‘) continue;
if(ch == ‘+‘ || ch == ‘-‘ || ch == ‘*‘ || ch == ‘/‘ || ch == ‘(‘){
push_num();
if(op_top > -1){
char op = ops[op_top];
if( (op == ‘*‘ || op == ‘/‘)&&(ch == ‘+‘ || ch == ‘-‘) ){// 乘/除优先于加/减
datas[++data_top].op = op;
--op_top;
}
}
ops[++op_top] = ch;
}else if(ch == ‘)‘){
push_num();
while(ops[op_top] != ‘(‘){
datas[++data_top].op = ops[op_top];
--op_top;
}
--op_top;
}else{
nums[++num_top] = ch;
}
}// end of while *tmp
push_num();//最后的数据入栈
while(op_top > -1){//最后的操作符入栈
datas[++data_top].op = ops[op_top];
--op_top;
}
}
//计算值
float calculating(){
if(data_top < 0) return 0;
float stack[CNT] = {0};
int top = -1;
int i = 0;
while(i <= data_top){
char op = datas[i].op;
if(op == 0){
stack[++top] = datas[i].num;
}else{
float a = stack[top -1];
float b = stack[top];
--top;
float c = 0;
if(op == ‘+‘) c = a + b;
else if(op == ‘-‘) c = a -b;
else if(op == ‘*‘) c = a * b;
else if(op == ‘/‘) c = a / b;
stack[top] = c;
}
++i;
}
if(top < 0) return 0;
else return stack[top];
}
int main(int argc, char *argv[]){
char *parms = "20.5+(100-(3+2)*8)/(8-5) - 10";
memset(datas, 0, sizeof(datas));
memset(ops, 0, sizeof(ops));
data_top = -1;
op_top = -1;
num_top = -1;
mtoe(parms);
printf("%s = ",parms);
printf("%f\n",calculating());
int i = 0;
for(i = 0; i <= data_top; i++){
if(datas[i].op) printf("%c ", datas[i].op);
else printf("%f ",datas[i].num);
}
printf("\n");
return 0;
}
标签:clu top cal 逆波兰表达式 lib fine div str 表达
原文地址:https://www.cnblogs.com/btxz/p/12104221.html