概述
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "math.h"
#pragma region 使用粘贴符定义复用栈代码
#define DelcareStack(type)
typedef struct type##_Node
{
type data;
struct type##_Node *next;
} type##Stack;
int type##StackEmpty(type##Stack *stack)
{
return stack == NULL;
}
void type##StackPush(type##Stack **stack, type c)
{
type##Stack *node = (type##Stack *)malloc(sizeof(type##Stack));
node->data = c;
node->next = *stack;
*stack = node;
}
int type##StackPop(type##Stack **stack, type *data)
{
if (*stack == NULL)
return 0;
else
{
*data = (*stack)->data;
*stack = (*stack)->next;
return 1;
}
}
int type##StackTop(type##Stack *stack, type *data)
{
if (stack == NULL)
return 0;
else
{
*data = stack->data;
return 1;
}
}
#pragma endregion 复用栈
DelcareStack(char)
DelcareStack(float)
int higherThan(char opInExp, char opInStack)
{
char *ops = "+-*/%^";
int rate[6] = {0, 0, 1, 1, 1, 2};
int expRate, stackRate;
if (opInExp == ')')
return 0;
if (opInExp == '(')
return 1;
if (opInStack == '(')
return 1;
expRate = rate[(char *)strchr(ops, opInExp) - ops];
stackRate = rate[(char *)strchr(ops, opInStack) - ops];
return expRate - stackRate;
}
float calc(float a, float b, char op)
{
switch (op)
{
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
case '%':
return (int)a % (int)b;
case '^':
return pow(a, b);
}
}
float calcExp(char *expression)
{
charStack *op=NULL; //运算符栈
floatStack *ob=NULL; //对象栈
char *p = expression, opInStack;
float a, b;
while (*p)
{
if (strchr("0123456789", *p))
{
floatStackPush(&ob, *p - 48);
p++;
}
else
{
if (charStackEmpty(op))
{
charStackPush(&op, *p);
p++;
}
else
{
charStackTop(op, &opInStack);
if (higherThan(*p, opInStack) > 0)
{
charStackPush(&op, *p);
p++;
}
else
{
charStackPop(&op, &opInStack);
if (opInStack != '(')
{
floatStackPop(&ob, &b);
floatStackPop(&ob, &a);
printf("calculating %f%c%fn", a, opInStack, b);
floatStackPush(&ob, calc(a, b, opInStack));
}
else
p++;
}
}
}
}
while (!charStackEmpty(op))
{
floatStackPop(&ob, &b);
floatStackPop(&ob, &a);
charStackPop(&op, &opInStack);
printf("calculating %f%c%fn", a, opInStack, b);
floatStackPush(&ob, calc(a, b, opInStack));
}
floatStackPop(&ob, &a);
return a;
}
int main()
{
printf("%.2f", calcExp("3*2^(4+2*2-1*3)-5"));
getchar();
}
我的代码:
/*
因为没完全看懂##那里的代码,所以我就用了c++的stack
还有判断优先级的函数也没看懂
*/
#include<iostream>
#include "stdlib.h"
#include "string.h"
#include "math.h"
#include<stack>
using namespace std;
//这个函数没搞明白是咋运行的
int higherThan(char opInExp, char opInStack)
{
const char* ops = "+-*/%^"; //这里不明白
int rate[6] = { 0, 0, 1, 1, 1, 2 }; //这里不明白
int expRate, stackRate;
if (opInExp == ')')
return 0;
if (opInExp == '(')
return 1;
if (opInStack == '(')
return 1;
expRate = rate[(char*)strchr(ops, opInExp) - ops]; //这里不明白
stackRate = rate[(char*)strchr(ops, opInStack) - ops]; //这里不明白
return expRate - stackRate;
}
void calcExp(char* expression) {
stack<char> st;
char* p = expression; //指针p指向的是我们输入的表达式的第一个字符
char topchar, temp;
while (*p) {
if (strchr("0123456789", *p)) {
//如果这个字符是运算数,那么输出
printf("%c", *p);
p++;
}
else {
if (st.empty()) { //如果栈为空,那么将运算符入栈
st.push(*p);
p++;
}
else { //如果栈不空的话
topchar = st.top(); //获取栈顶元素
if (higherThan(*p, topchar) > 0) //如果读取到的字符的优先级大于栈顶元素,入栈
{
st.push(*p);
p++;
}
else { //如果读取到的字符的优先级小于栈顶元素,那么就要输出了
temp = st.top();
st.pop();
if (temp != '(') {
printf("%c", temp);
}
else {
p++;
}
}
}
}
}
while (!st.empty()) {
printf("%c", st.top());
st.pop();
}
}
int main() {
char s[100];
scanf("%s", s);
calcExp(s);
getchar();
}
最后
以上就是开放热狗为你收集整理的下面是公式计算的代码,尝试在理解的前提下改造成中缀表达式转换后缀表达式的代码。的全部内容,希望文章能够帮你解决下面是公式计算的代码,尝试在理解的前提下改造成中缀表达式转换后缀表达式的代码。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复