鱼C论坛

 找回密码
 立即注册
查看: 861|回复: 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)
  1. #include <iostream>
  2. #include <utility>
  3. #include <cctype>
  4. #include <string>
  5. #include <iomanip>

  6. template <typename T>
  7. class Operand {
  8. public:
  9.         T val;
  10.         Operand* next;
  11. };

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

  13. template<typename T>
  14. void push(Operand<T>** Opr, T val) {
  15.         Operand<T>* p = *Opr;
  16.         (*Opr) = new Operand<T>;
  17.         (*Opr)->val = val;
  18.         (*Opr)->next = p;
  19. }

  20. template<typename T>
  21. std::pair<T, T> pop(Operand<T>** Opr) {
  22.         std::pair<T, T> val;
  23.         Operand<T>* p = *Opr;
  24.         (*Opr) = (*Opr)->next;
  25.         val.second = p->val;
  26.         delete p;
  27.         p = (*Opr);
  28.         (*Opr) = (*Opr)->next;
  29.         val.first = p->val;
  30.         delete p;
  31.         return val;
  32. }

  33. template<typename T>
  34. double operation(std::pair<T, T> P, char c) {
  35.         T a = P.first;
  36.         T b = P.second;
  37.         switch (c)
  38.         {
  39.         case '+':
  40.                 return a + b;
  41.         case '-':
  42.                 return a - b;
  43.         case '*':
  44.                 return a * b;
  45.         case '/':
  46.                 if (b) {
  47.                         return a / b;
  48.                 }
  49.                 else {
  50.                         std::cout
  51.                                 << "error: division by zero"
  52.                                 << std::endl;
  53.                         exit(0);
  54.                 }
  55.         }
  56.         exit(0);
  57.         return 0;
  58. }

  59. template<typename T>
  60. void print(Operand<T>** Opr) {
  61.         Operand<T>* p = (*Opr);
  62.         while (p) {
  63.                 if (isINT(p->val)) {
  64.                         std::cout << std::fixed << std::setprecision(0);
  65.                 }
  66.                 std::cout
  67.                         << p->val
  68.                         << " ";
  69.                 p = p->next;
  70.         }
  71.         std::cout << std::endl;
  72. }

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

  77.         // 只能单个数值运算,比如:7、6、8 等
  78.         for (char c: str) {
  79.                 if (c >= '0' && c <= '9') {
  80.                         push(&Opr, static_cast<double>(c - '0'));
  81.                 }
  82.                 else if (c == '+' || c == '-' || c == '*' || c == '/') {
  83.                         push(&Opr, operation(pop(&Opr), c));
  84.                 }
  85.         }
  86.         print(&Opr);
  87.         delete Opr;
  88.         return 0;
  89. }
复制代码

以 5 + ((1 + 2) * 4) - 3 为例:
5 1 2 + 4 * + 3 -(逆波兰表示法)
  1. 5 1 2 + 4 * + 3 -
  2. 14
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  6. template <typename T>
  7. class Operand {
  8. public:
  9.         T val;
  10.         Operand* next;
  11. };

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

  13. template<typename T>
  14. void push(Operand<T>** Opr, T val) {
  15.         Operand<T>* p = *Opr;
  16.         (*Opr) = new Operand<T>;
  17.         (*Opr)->val = val;
  18.         (*Opr)->next = p;
  19. }

  20. template<typename T>
  21. std::pair<T, T> pop(Operand<T>** Opr) {
  22.         std::pair<T, T> val;
  23.         Operand<T>* p = *Opr;
  24.         (*Opr) = (*Opr)->next;
  25.         val.second = p->val;
  26.         delete p;
  27.         p = (*Opr);
  28.         (*Opr) = (*Opr)->next;
  29.         val.first = p->val;
  30.         delete p;
  31.         return val;
  32. }

  33. template<typename T>
  34. double operation(std::pair<T, T> P, char c) {
  35.         T a = P.first;
  36.         T b = P.second;
  37.         switch (c)
  38.         {
  39.         case '+':
  40.                 return a + b;
  41.         case '-':
  42.                 return a - b;
  43.         case '*':
  44.                 return a * b;
  45.         case '/':
  46.                 if (b) {
  47.                         return a / b;
  48.                 }
  49.                 else {
  50.                         std::cout
  51.                                 << "error: division by zero"
  52.                                 << std::endl;
  53.                         exit(0);
  54.                 }
  55.         }
  56.         exit(0);
  57.         return 0;
  58. }

  59. template<typename T>
  60. void print(Operand<T>** Opr) {
  61.         Operand<T>* p = (*Opr);
  62.         while (p) {
  63.                 if (isINT(p->val)) {
  64.                         std::cout << std::fixed << std::setprecision(0);
  65.                 }
  66.                 std::cout
  67.                         << p->val
  68.                         << " ";
  69.                 p = p->next;
  70.         }
  71.         std::cout << std::endl;
  72. }

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

  77.         // 只能单个数值运算,比如:7、6、8 等
  78.         for (char c: str) {
  79.                 if (c >= '0' && c <= '9') {
  80.                         push(&Opr, static_cast<double>(c - '0'));
  81.                 }
  82.                 else if (c == '+' || c == '-' || c == '*' || c == '/') {
  83.                         push(&Opr, operation(pop(&Opr), c));
  84.                 }
  85.         }
  86.         print(&Opr);
  87.         delete Opr;
  88.         return 0;
  89. }
复制代码

以 5 + ((1 + 2) * 4) - 3 为例:
5 1 2 + 4 * + 3 -(逆波兰表示法)
  1. 5 1 2 + 4 * + 3 -
  2. 14
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 19:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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