当前位置:编程学习 > C/C++ >>

C语言:逆波兰表达式代码

今天有师妹求助,要实现带有括号、加减乘除、阶乘的表达式计算

一时冲动便给师妹写了一下,C语言代码如下,用了两个栈来实现逆波兰表达式求值:

[c]
//
#include <stdio.h> 
#include <stdlib.h> 
//运算符栈的长度 
#define OPSTACK_LENGTH 5 
//操作数栈的长度 
#define NUMSTACK_LENGTH 100 
//输入串的最大长度 
#define MAX_STRING_LENGTH 100 
 
//运算符结构体 
struct operatorStruct 

    //运算符名称 
    char name; 
    //优先级 
    int priority; 
    //目数,即操作数个数,例如单目运算符为1,双目运算符2 
    int opnum; 
}; 
 
typedef struct operatorStruct OPERATOR; 
 
//运算符栈 
OPERATOR opStack[OPSTACK_LENGTH]; 
//运算符栈顶指针 
int opStackTop = -1; 
//操作数栈 
double numStack[NUMSTACK_LENGTH]; 
//操作数栈顶指针 
int numStackTop = -1; 
 
//获取一个字符所代表的运算符的优先级 
int getPriority(char name) 

    if (name == '(' || name == ')') 
    { 
        return 0; 
    } 
    if (name == '!') 
    { 
        return 3; 
    } 
    if (name == '*' || name == '/') 
    { 
        return 2; 
    } 
    if (name == '+' || name == '-') 
    { 
        return 1; 
    } 
    exit(1); 

//获取一个字符所代表的运算符的目数 
int getOpNum(char name) 

    if (name == '*' || name == '/' || name == '+' || name == '-') 
    { 
        return 2; 
    } 
    if (name == '!') 
    { 
        return 1; 
    } 
    if (name == '(' || name == ')') 
    { 
        return 0; 
    } 
    exit(1); 

 
//运算符压栈 
void pushOperator(OPERATOR op) 

    if (opStackTop < OPSTACK_LENGTH - 1) 
    { 
        opStack[++opStackTop] = op; 
    } 
    else 
    { 
        exit(1); 
    } 

//运算符出栈 
OPERATOR popOperator() 

    if (opStackTop >= 0) 
    { 
        return opStack[opStackTop--]; 
    } 
    else 
    { 
        exit(1); 
    } 

//操作数压栈 
void pushNumber(double num) 

    if (numStackTop < NUMSTACK_LENGTH - 1) 
    { 
        numStack[++numStackTop] = num; 
    } 
    else 
    { 
        exit(1); 
    } 

//操作数出栈 
double popNumber() 

    if (numStackTop >= 0) 
    { 
        return numStack[numStackTop--]; 
    } 
    else 
    { 
        exit(1); 
    } 

//将输入字符串中的以0-9开头、到下一个运算符结束的一段转化为浮点型 
//i加上浮点型对应的字符串的长度 
double getNumFromString(char *s, int *i) 

    int j = 0; 
    static char numstr[MAX_STRING_LENGTH]; 
    while ((*s) >= '0' && *s <= '9') 
    { 
        numstr[j++] = (*s); 
        s++; 
    } 
    if ((*s) == '.') 
    { 
        numstr[j++] = (*s); 
        s++; 
        while ((*s) >= '0' && *s <= '9') 
        { 
            numstr[j++] = (*s); 
            s++; 
        } 
    } 
    (*i) = (*i) + j; 
    numstr[j] = '\0'; 
    return atof(numstr); 

 
//从操作数栈中弹出两个操作数,完成一次双目运算 
double opertate2Num(OPERATOR op) 

    double num2 = popNumber(); 
    double num1 = popNumber(); 
    if (op.name == '+') 
    { 
        return num1 + num2; 
    } 
    if (op.name == '-') 
    { 
        return num1 - num2; 
    } 
    if (op.name == '*') 
    { 
        return num1 * num2; 
    } 
    if (op.name == '/') 
    { 
        return num1 + num2; 
    } 
    exit(1); 

//从操作数栈中弹出一个操作数,完成一次单目运算 
double opertate1Num(OPERATOR op) 

    double num = popNumber(); 
    if (op.name == '!') 
    { 
        double result = 1; 
        while (num > 1) 
        { 
            result *= num; 
 &n

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,