逆波兰式的转换 一直过不了 5C

编译正确,输入也正常,但输出总中断,输出的部分也对,求大佬检查一下,到底是哪的问题
#include
#include

typedef struct Node
{
char data;
struct Node *next;
}Node,*pNode;

typedef struct Stack
{
pNode top;
}Stack,*pStack;

pStack createStack()
{
pStack pstack;
pstack=(pStack)malloc(sizeof(Stack));
pstack->top=NULL;
return pstack;
}

void Push(pStack pstack,char c)
{
pNode p;
p=(pNode)malloc(sizeof(Node));
p->data=c;
p->next=pstack->top;
pstack->top=p;
}

void Pop(pStack pstack)
{
pNode p;
p=pstack->top;
char item;
item=pstack->top->data;
printf("%c",item);
pstack->top=pstack->top->next;
free(p);
}

void deletetop(pStack pstack)
{
pNode p;
p=pstack->top;
pstack->top=pstack->top->next;
free(p);
}

int first(char a,char b)
{
int a1;
if(a=='+')
{
if(b=='*'||b=='/') a1=0;
else if(b=='-') a1=1;
}
else if(a=='-')
{
if(b=='*'||b=='/') a1=0;
else if(b=='+') a1=1;
}
else if(a=='*') a1=1;
else if(a=='/') a1=1;
return a1;
}

void transfo(pStack pstack)
{
char c;
int a;
while((c=getchar())!='\n')
{
if(c>96&&c {
printf("%c",c);
}
else if(c=='+'||c=='-'||c=='*'||c=='/')
{
if(pstack->top->data=='+'||pstack->top->data=='-'||pstack->top->data=='*'||pstack->top->data=='/')
{
a=first(c,pstack->top->data);
if(a==0)
{
while(a==0)
{
Pop(pstack);
}
Push(pstack,c);
}
else if(a==1)
{
Push(pstack,c);
}
}
else if(pstack->top->data=='(')
Push(pstack,c);
else if(pstack->top==NULL)
Push(pstack,c);

    }
    else if(c=='(')
    {
        Push(pstack,c);
    }
    else if(c==')')
    {
        while(pstack->top->data!='(')
        {
            Pop(pstack);
        }
       // if(pstack->top->data=='(')
                deletetop(pstack);
    }
}
while(pstack->top!=NULL)
{
    Pop(pstack);
}

}

int main()
{
pStack pstack;
pstack=createStack();
transfo(pstack);
return 0;
}

0

1个回答

2
zhang911007xing
语冰泉 太谢谢您了,终于过了
2 年多之前 回复
zhang911007xing
语冰泉 这个整体思路我看了您发的链接,觉得挺对的,过不了应该是个细节问题,但是找不出来,哎
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
逆波兰式转换及求值
实验题目: 表达式求值<br><br>◎实验目的:熟悉栈的用法,并训练应用栈解决实际问题<br><br>◎实验内容:使用键盘输入表达式,计算表达式的值并输出;将表达式转化成后 缀表达式输出,利用后缀表达式求表达式的值并输出。<br>
表达式的逆波兰式转换
将一个中缀表达式转换成后缀表达式(逆波兰式),用到了堆栈的数据结构。
逆波兰式的转换与计算(简单)
我们平常书写的表达式:--如2+3*4+4 又称为中缀表达式,我们可以将它转换为后缀表达式 213*+4+ 输入有两行,第一行为逆波兰式的结果,第二行为输入表达式的正确计算结果。逆波兰式中相邻的数字或运算符之间不用输出空格 保证表达式计算的合理性,不需判断除零等情况 表达式的计算遵循同级运算从左向右,先乘除后加减 样例输入: 2+1*3+4 样例输出: 213*+4+ 9   ...
数据结构基础:逆波兰式转换
题目:点击打开链接 数据结构实验之栈二:一般算术表达式转换成后缀式 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。 Input 输入一个算术表达式,以‘#’字符作为结束标志。 Output 输出该表达式转换所得到的后缀式。 Example
后缀表达式(逆波兰式)、中缀表达式的转换与求值
/***********************************************************************************************************************一、把中缀表达式转换为后缀表达式算法的基本思路是从头到尾地扫描中缀表达式中的每个字符,对于不同类型的字符按不情况进行处理。1、先定义一个工作数组,用来存储转换之...
编译原理中逆波兰式的转换算法
编译原理中的中间语言翻译器的构造所使用的将一个表达式转换为逆波兰式的算法实现,我用的是vc++6.0写的,程序挺简单的
【数据结构】中缀表达式转换后缀表达式(逆波兰式)
我的第一篇博文就是关于逆波兰式的,现在回头看感觉当时的代码太过混乱(不忍直视),在这里对当时的代码进行一次重构。#include <stdio.h> #include "stack.h" #define MaxSize 30 int Judge(int flag,char operater) { if(flag) switch(operater){ c
表达式计算 - 逆波兰式转换及运算示例
表达式计算 - 逆波兰式转换及运算示例自定义表达式运算中,涉及到三个步骤: 1.关键字析取 2.中序表达式转逆波兰表达式 3.逆波兰表达式运算。 本实现基于C#,可生成对象化的中序表达式和逆波兰表达式,可处理函数,并有规范的函数运算扩展示例。
递归实现逆波兰式到正常表达式的转换
#include#define m printf("(")#define n printf(")")#define pzj polan()using namespace std;char a[100];double pzj{ scanf("%s",a); switch(a[0]) { case+: m; pzj; printf("+
逆波兰式
逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)*(c+d)转换为ab+cd+*d+。它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下:如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。将一个普通的中序表达式转换为逆波兰表达式的一般算法是:(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。(2)读入一个用
求助关于逆波兰式转换的vc/MFC程序代码
在编译原理中,逆波兰是编译程序常用的中间代码形式,rn例如:rna+b ---> ab+rna+b*c --->abc*+rn(a+b)*c --->ab+c*rna:=b*c+b*d --->abc*bd*+:=rnrn请教朋友们提供一个逆波兰转换的MFC/vc程序,rn不甚感激.rne-mail:snowboy_xu@163.com
后缀表达式(逆波兰式)、中缀表达式的转换与求值【转】
一、把中缀表达式转换为后缀表达式算法的基本思路是从头到尾地扫描中缀表达式中的每个字符,对于不同类型的字符按不情况进行处理。1、先定义一个工作数组,用来存储转换之后的后缀表达式,定义一个栈,用来存储运算符。(越往栈顶优先级越高的原则)可以先定 义一个‘#’优先级为0存入栈底2、扫描:若遇到的是操作数,直接存入工作数组中,若遇到运算符,将该运算符与栈顶元素比较,若该运算符优先级高,直接入栈,否则,...
编译过不了
/*以十进制、八进制和十六进制形式输出100*/rn#include rnint mian(void)rnrn int x=100;rn printf("dec=%d;octal=%o;hex=%x\n",x,x,x);rn printf("dec=%d;octal=%#o;hex=%#x\n",x,x,x);rn return 0;rn rn rn//无法通过编译,原因不明。求解?
过不了今天
       身心疲惫的我只有一晚上的时间休息,好像听听她的声音,但是依然没有能等到盼望已久的电话声。大气点,于是我再次主动的拿起电话,电话那头的她话是如此的少,和以前一样又是我一个人说。这些都没关系,我依然爱你,我愿意这么做。      2007现在才刚开始,一切都在按照我的计划在进行。不过,两边的事情让我再次感到压力来临。一边要做好自己的本职工作,一边要对一个陌生的领域进行尝试,好需要一个
编译原理 —— 逆波兰式
逆波兰式除去了原表达式中的括号,并将运算对象写在前面,运算符写在后面,因而又称为后缀式。用逆波兰式表示表达式的最大优点是易于计算处理。 逆波兰式只使用一个工作栈,当计算机自左向右顺序扫描逆波兰式时,若当前符号是运算对象则进栈,若当前符号是运算符,并且为K元运算符,则将栈顶的K个元素依次取出,同时进行K元运算,并将运算结果置于栈顶,表达式处理完毕时,其计算结果自然呈现在栈顶。 逆波兰式的定义 ...
逆波兰式(后缀表达式)
一个表达式的逆波兰式可以用如下方法获得: 将表达式写成二叉树的形式,然后将二叉树的节点以中序的方式输出即是逆波兰式。 比如E=a+b*(c-d)/e-f 二叉树形式为 正好插着画板于是。。= =! 因此E的后缀表达式为abcd-*e/+f-
逆波兰式算法
定义   逆波兰式也叫后缀表达式(将运算符写在操作数之后)   如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+   (a+b)*c-(a+b)/e的后缀表达式为:  (a+b)*c-(a+b)/e  →((a+b)*c)((a+b)/e)-  →((a+b)c*)((a+b)e/)-  →(ab+c*)(ab+e/)-  →ab+c*ab+e/-
逆波兰式递归实现
逆波兰式的递归实现(c++),其实这个很接近一个完整的计算器了,有兴趣的可以继续扩展功能
高通 6.0平台,过CTA,彩信一直过不了怎么解决?
高通6.0平台,过CTA,泰尔实验室一直是出这个问题,发送彩信,设置-应用中无彩信相关配置,调用无提示,彩信直接发送成功,哪位大侠有现成的修改文档。
波兰式与逆波兰式
从这篇博客学习到的:点击打开链接 一、波兰式 波兰式是在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之前,所以,这种表示法也称为前缀表达式。例如:3*(2-(5+1)),用波兰式来表示是:* 3 - 2 + 5 1。 阅读这个表达式需要从左至右读入表达式,如果一个操作符后面跟着两个操作数时,则计算,然后将结果作为操作数替换这个操作符和两个操作数,重复此步骤,直至所有操作符处理完毕...
简单计算器-逆波兰式
C - 简单计算器 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1237 Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
逆波兰式计算
下面的逆波兰式,不支持单目运算,以及{}、〔〕这两类的括号运算。对精度提供了设置,根据你输入的浮点数的小数位的位数来适应,返回和操作数相同位数的结果。由于写的匆忙,好存在很多缺陷。不足的地方希望能给出批评。 java 代码   1.stack.java      import java.util.LinkedList;      /**  ...
栈:逆波兰式
题目: 假设表达式由数字和双目四则运算符+,-,*,/构成。试利用栈实现一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式(后缀表达式),同时将转换后的逆波兰式求值,最后仅需输出求值结果。 输入格式 输入共有一行,为待求值的表达式,以换行结束。表达式保证是合法的,表达式中的整数在 [0,10][0,10] 以内,表达式长度不超过 2020。表达式中仅包含+,-,*,/以及数
谁帮忙看看这道题目,我写的代码一直过不了
B:马走日n查看 提交 统计 提问n总时间限制: 1000ms 内存限制: 1024kBn描述n马在中国象棋以日字形规则移动。nn请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。nn输入n第一行为整数T(T < 10),表示测试数据组数。n每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0<=x<=n-1,0<=y<=m-1, m < 10, n < 10)n输出n每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。n样例输入n1n5 4 0 0n样例输出n32
java 逆波兰式
package t2; //一直想去实现这个算法,直到今天才将它写出来,主要目的是为了计算此种表达式 ((1+1)*2+2)*3 // //java代码如下: //////////// ///Tn.java /////////// import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Patt