鱼C论坛

 找回密码
 立即注册
查看: 679|回复: 1

[已解决]程序有问题答案不对,后缀表达式

[复制链接]
发表于 2022-3-23 18:26:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define Stack_InitSize 20
#define addSize 5
#pragma warning(disable:4996)

typedef double ElemType;
typedef struct sqStack
{
        ElemType* base;
        ElemType* top;
        int stackSize;
}sqStack;

void InitStack(sqStack* s)
{
        s->base = (ElemType*)malloc(Stack_InitSize * sizeof(ElemType));
        if (!s->base)
                exit(0);
        s->top = s->base;
        s->stackSize = Stack_InitSize;
}
void Push(sqStack* s, ElemType e)
{
        if (s->top - s->base >= s->stackSize)
        {
                s->base = (ElemType*)realloc(s->base, (addSize + s->stackSize) * sizeof(ElemType));
                if (!s->base)
                        exit(0);
                s->top = s->base + s->stackSize;
                s->stackSize = s->stackSize + addSize;
        }
        *s->top = e;
        s->top++;
}
void Pop(sqStack* s, ElemType* e)
{
        if (s->top == s->base)
        {
                *e = *(--s->top);
        }
}
int main()
{
        sqStack s;
        char c;
        int i = 0;
        double d, e;
        char str[10];
        InitStack(&s);
        printf("请按逆波兰表达式输入运算式 : \n");
        scanf("%c", &c);
        while (c != '\n')
        {
                while (isdigit(c) || c == '.')//判断c的ASCII码是否为48-57 即是否为数字
                {
                        str[i++] = c;
                        str[i] = '\0';
                        if (i >= 10)
                        {
                                printf("出错,输入的单个数据过大\n");
                                return -1;
                        }
                        scanf("%c", &c);
                        if (c == ' ')
                        {
                                d = atof(str);
                                //将字符串转化为浮点数
                                Push(&s,d);
                                i = 0;
                                break;
                        }
                }
                switch (c)
                {
                case '+' :
                        Pop(&s, &e);
                        Pop(&s, &d);
                        Push(&s, d + e);
                        break;
                case '-' :
                        Pop(&s, &e);
                        Pop(&s, &d);
                        Push(&s, d - e);
                        break;
                case '*':
                        Pop(&s, &e);
                        Pop(&s, &d);
                        Push(&s, d * e);
                        break;
                case '/':
                        Pop(&s, &e);
                        Pop(&s, &d);
                        if (d == 0)
                        {
                                printf("除数为0\n");
                                exit(0);
                        }
                        Push(&s, d / e);
                        break;
                }
                scanf("%c", &c);
        }
        Pop(&s, &d);
        printf("最终结果为 : %f\n", d);
        return 0;
}
/*
请按逆波兰表达式输入运算式 :
1 2 +
最终结果为 : 2.000000

D:\ly\逆波兰计算\x64\Debug\逆波兰计算.exe (进程 16904)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .





*/
最佳答案
2022-3-23 20:25:03
本帖最后由 傻眼貓咪 于 2022-3-23 21:24 编辑

试试我的代码吧,这是我第一次写逆波兰表达式运算式 ,如有错,见笑了:(只能作单个数字运算,0~9)
#include <iostream>
#include <utility>
#include <cctype>
#include <string>
#include <iomanip> 

template <typename T>
class Operand {
public:
        T val;
        Operand* next;
};

auto isINT = [](double d) -> bool { return !(d - static_cast<int>(d)); };

template<typename T>
void push(Operand<T>** Opr, T val) {
        Operand<T>* p = *Opr;
        (*Opr) = new Operand<T>;
        (*Opr)->val = val;
        (*Opr)->next = p;
}

template<typename T>
std::pair<T, T> pop(Operand<T>** Opr) {
        std::pair<T, T> val;
        Operand<T>* p = *Opr;
        (*Opr) = (*Opr)->next;
        val.second = p->val;
        delete p;
        p = (*Opr);
        (*Opr) = (*Opr)->next;
        val.first = p->val;
        delete p;
        return val;
}

template<typename T>
double operation(std::pair<T, T> P, char c) {
        T a = P.first;
        T b = P.second;
        switch (c)
        {
        case '+':
                return a + b;
        case '-':
                return a - b;
        case '*':
                return a * b;
        case '/':
                if (b) {
                        return a / b;
                }
                else {
                        std::cout
                                << "error: division by zero"
                                << std::endl;
                        exit(0);
                }
        }
        exit(0);
        return 0;
}

template<typename T>
void print(Operand<T>** Opr) {
        Operand<T>* p = (*Opr);
        while (p) {
                if (isINT(p->val)) {
                        std::cout << std::fixed << std::setprecision(0);
                }
                std::cout
                        << p->val
                        << " ";
                p = p->next;
        }
        std::cout << std::endl;
}

int main() {
        Operand<double>* Opr = NULL;
        std::string str;
        std::getline(std::cin, str);

        // 只能单个数值运算,比如:7、6、8 等
        for (char c: str) {
                if (c >= '0' && c <= '9') {
                        push(&Opr, static_cast<double>(c - '0'));
                }
                else if (c == '+' || c == '-' || c == '*' || c == '/') {
                        push(&Opr, operation(pop(&Opr), c));
                }
        }
        print(&Opr);
        delete Opr;
        return 0;
}

以 5 + ((1 + 2) * 4) - 3 为例:
5 1 2 + 4 * + 3 -(逆波兰表示法)
5 1 2 + 4 * + 3 -
14
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-23 20:25:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2022-3-23 21:24 编辑

试试我的代码吧,这是我第一次写逆波兰表达式运算式 ,如有错,见笑了:(只能作单个数字运算,0~9)
#include <iostream>
#include <utility>
#include <cctype>
#include <string>
#include <iomanip> 

template <typename T>
class Operand {
public:
        T val;
        Operand* next;
};

auto isINT = [](double d) -> bool { return !(d - static_cast<int>(d)); };

template<typename T>
void push(Operand<T>** Opr, T val) {
        Operand<T>* p = *Opr;
        (*Opr) = new Operand<T>;
        (*Opr)->val = val;
        (*Opr)->next = p;
}

template<typename T>
std::pair<T, T> pop(Operand<T>** Opr) {
        std::pair<T, T> val;
        Operand<T>* p = *Opr;
        (*Opr) = (*Opr)->next;
        val.second = p->val;
        delete p;
        p = (*Opr);
        (*Opr) = (*Opr)->next;
        val.first = p->val;
        delete p;
        return val;
}

template<typename T>
double operation(std::pair<T, T> P, char c) {
        T a = P.first;
        T b = P.second;
        switch (c)
        {
        case '+':
                return a + b;
        case '-':
                return a - b;
        case '*':
                return a * b;
        case '/':
                if (b) {
                        return a / b;
                }
                else {
                        std::cout
                                << "error: division by zero"
                                << std::endl;
                        exit(0);
                }
        }
        exit(0);
        return 0;
}

template<typename T>
void print(Operand<T>** Opr) {
        Operand<T>* p = (*Opr);
        while (p) {
                if (isINT(p->val)) {
                        std::cout << std::fixed << std::setprecision(0);
                }
                std::cout
                        << p->val
                        << " ";
                p = p->next;
        }
        std::cout << std::endl;
}

int main() {
        Operand<double>* Opr = NULL;
        std::string str;
        std::getline(std::cin, str);

        // 只能单个数值运算,比如:7、6、8 等
        for (char c: str) {
                if (c >= '0' && c <= '9') {
                        push(&Opr, static_cast<double>(c - '0'));
                }
                else if (c == '+' || c == '-' || c == '*' || c == '/') {
                        push(&Opr, operation(pop(&Opr), c));
                }
        }
        print(&Opr);
        delete Opr;
        return 0;
}

以 5 + ((1 + 2) * 4) - 3 为例:
5 1 2 + 4 * + 3 -(逆波兰表示法)
5 1 2 + 4 * + 3 -
14
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 04:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表