利用栈将数学中的中缀表达式转换为后缀表达式并输出,求助求助求助!!!

jhunhaohao 2017-04-16 07:55:02
我是大一的,如题,题目要求是利用栈将数学中的中缀表达式转换为后缀表达式并输出,我的代码已经写完,如下:
#include <iostream>
#include <string.h>
#include <math.h>

using namespace std;

int Priority(char); //将运算符的优先级转换为可比较大小的数字

int main(void)
{
char infix[100], suffix[100]; //分别用于接收中缀表达式和后缀表达式
int inlen = 0, suflen = 0;

cin >> infix; //接收中缀表达式

puts(infix);

char stack[100] = { 0 }, pti = -1; //创建一个空栈,stcak[pti]为栈顶

for (inlen = 0; infix[inlen]; inlen++) //依次检查每一个元素
{
if (infix[inlen] >= 'A'&&infix[inlen] <= 'Z') //操作数A--Z
suffix[suflen++] = infix[inlen];

else if (Priority(infix[inlen]>0)) //运算符+ - * / ^(乘方)
{
while (pti >= 0 && stack[pti] != '('&& Priority(stack[pti])>0 &&Priority(infix[inlen]) <= Priority(stack[pti])) //栈不空且栈顶元素不为'('且满足优先级条件
suffix[suflen++] = stack[pti--];
stack[++pti] = infix[inlen]; //栈为空的时候,当前运算符入栈
}

else if (infix[inlen] == '(') //为(
stack[++pti] = infix[inlen];

else if (infix[inlen] == ')') //为)
{
while (pti >= 0 && stack[pti] != '(')
suffix[suflen++] = stack[pti--]; //退栈并且输出出栈的运算符
if (stack[pti]>=0)
pti--;
else
cout << "Error\n"; //做一次退栈操作
}

else //其他字符
cout << "Error\n";

}
while (pti >= 0 && stack[pti] != '(') //栈不空且栈顶元素不为'('时
suffix[suflen++] = stack[pti--]; //退栈并且输出出栈的运算符
suffix[suflen] = '\0';
if (pti >= 0) //如果栈不空,报错
cout << "Error\n";

//测试
for (int i = 0; i <= suflen; i++)
cout << suffix[i];
//测试

return 0;
}
int Priority(char ch) //将运算符的优先级转换为可比较大小的数字
{
if (ch == '+' || ch == '-')
return 1;
else if (ch == '*' || ch == '/')
return 2;
else if (ch == '^')
return 3;
else
return 0;
}
问题是:我用for语句逐个检查infix数组的每个元素,当检查到的是+ - * /等运算符的时候,没有识别为我定义的运算符而是识别成了其他字符,导致击中红色字体部分的断点并输出Error,请问是什么原因以及如何解决

跪求!!谢谢各位前辈!!!
...全文
182 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jhunhaohao 2017-04-17
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>

using namespace std;

int Priority(char);    //将运算符的优先级转换为可比较大小的数字

int main(void)
{
    char infix[100], suffix[100];   //分别用于接收中缀表达式和后缀表达式
    char stack[100] = { 0 };
    int inlen = 0, suflen = 0;
    cin >> infix;   //接收中缀表达式

    puts(infix);
    int pti = -1;   //创建一个空栈,stcak[pti]为栈顶

    for (inlen = 0; infix[inlen]; inlen++)  //依次检查每一个元素
    {
        if (infix[inlen] >= 'A' && infix[inlen] <= 'Z') { //操作数A--Z
            suffix[suflen++] = infix[inlen];
        } else if (Priority(infix[inlen]) > 0) //运算符+ - * / ^(乘方)
        {
            while (pti >= 0 && stack[pti] != '(' && Priority(stack[pti]) > 0 && Priority(infix[inlen]) <= Priority(stack[pti]))       //栈不空且栈顶元素不为'('且满足优先级条件
                suffix[suflen++] = stack[pti--];
            stack[++pti] = infix[inlen];      //栈为空的时候,当前运算符入栈
        } else if (infix[inlen] == '(')  //为(
            stack[++pti] = infix[inlen];

        else if (infix[inlen] == ')')  //为)
        {
            while (pti >= 0 && stack[pti] != '(')
                suffix[suflen++] = stack[pti--];   //退栈并且输出出栈的运算符
            if (stack[pti]>=0)
                pti--;
            else
                cout << "Error\n";  //做一次退栈操作
        } else  //其他字符
            cout << "Error\n";

    }
    while (pti >= 0 && stack[pti] != '(')  //栈不空且栈顶元素不为'('时
        suffix[suflen++] = stack[pti--];   //退栈并且输出出栈的运算符
    suffix[suflen] = '\0';
    if (pti >= 0)    //如果栈不空,报错
        cout << "Error\n";

    //测试
    for (int i = 0; i <= suflen; i++)
        cout << suffix[i];
    //测试
    cout<<endl;

    return 0;
}
int Priority(char ch)  //将运算符的优先级转换为可比较大小的数字
{
    if (ch == '+' || ch == '-')
        return 1;
    else if (ch == '*' || ch == '/')
        return 2;
    else if (ch == '^')
        return 3;
    else
        return 0;
}
问题是出在不细心。 对比一下这两个表达式的区别:
else if (Priority(infix[inlen]>0))
else if (Priority(infix[inlen])>0)
的区别;
是这样的,是我粗心了,没想到这么一个小小的粗心竟然让我对自己的算法质疑了两天,谢谢前辈,谢谢!!
自信男孩 2017-04-17
  • 打赏
  • 举报
回复
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>

using namespace std;

int Priority(char);    //将运算符的优先级转换为可比较大小的数字

int main(void)
{
    char infix[100], suffix[100];   //分别用于接收中缀表达式和后缀表达式
    char stack[100] = { 0 };
    int inlen = 0, suflen = 0;
    cin >> infix;   //接收中缀表达式

    puts(infix);
    int pti = -1;   //创建一个空栈,stcak[pti]为栈顶

    for (inlen = 0; infix[inlen]; inlen++)  //依次检查每一个元素
    {
        if (infix[inlen] >= 'A' && infix[inlen] <= 'Z') { //操作数A--Z
            suffix[suflen++] = infix[inlen];
        } else if (Priority(infix[inlen]) > 0) //运算符+ - * / ^(乘方)
        {
            while (pti >= 0 && stack[pti] != '(' && Priority(stack[pti]) > 0 && Priority(infix[inlen]) <= Priority(stack[pti]))       //栈不空且栈顶元素不为'('且满足优先级条件
                suffix[suflen++] = stack[pti--];
            stack[++pti] = infix[inlen];      //栈为空的时候,当前运算符入栈
        } else if (infix[inlen] == '(')  //为(
            stack[++pti] = infix[inlen];

        else if (infix[inlen] == ')')  //为)
        {
            while (pti >= 0 && stack[pti] != '(')
                suffix[suflen++] = stack[pti--];   //退栈并且输出出栈的运算符
            if (stack[pti]>=0)
                pti--;
            else
                cout << "Error\n";  //做一次退栈操作
        } else  //其他字符
            cout << "Error\n";

    }
    while (pti >= 0 && stack[pti] != '(')  //栈不空且栈顶元素不为'('时
        suffix[suflen++] = stack[pti--];   //退栈并且输出出栈的运算符
    suffix[suflen] = '\0';
    if (pti >= 0)    //如果栈不空,报错
        cout << "Error\n";

    //测试
    for (int i = 0; i <= suflen; i++)
        cout << suffix[i];
    //测试
    cout<<endl;

    return 0;
}
int Priority(char ch)  //将运算符的优先级转换为可比较大小的数字
{
    if (ch == '+' || ch == '-')
        return 1;
    else if (ch == '*' || ch == '/')
        return 2;
    else if (ch == '^')
        return 3;
    else
        return 0;
}
问题是出在不细心。 对比一下这两个表达式的区别:
else if (Priority(infix[inlen]>0))
else if (Priority(infix[inlen])>0)
的区别;
做一门精致,全面详细的 java数据结构与算法!!!让天下没有难学的数据结构,让天下没有难学的算法,不吹不黑,我们的讲师及其敬业,可以看到课程视频,课件,代码的录制撰写,都是在深夜,如此用心,其心可鉴,他不掉头发,谁掉头发???总之你知道的,不知道的,我们都讲,并且持续更新,走过路过,不要错过,不敢说是史上最全的课程,怕违反广告法,总而言之,言而总之,这门课你值得拥有,好吃不贵,对于你知识的渴求,我们管够管饱话不多说,牛不多吹,我们要讲的本门课程内容:稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、、前缀、缀、后缀表达式缀表达式转换后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧