逆波兰式,有关栈的问题

/*有关逆波兰式的问题,也叫后缀表达式(将运算符写在操作数之后);例如:a+b的逆波兰式为a b +;下列程序是有关数字与数字相加的,将程序简单理解为,如果是数字,那么压入栈中,如果是运算符,那么出栈,将此前压入栈中的两个数取出栈并且相加,相加后再压入栈中,以此类推(按运算符的优先级!)*/

#include <stdio.h>

#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#define STACK_INIT_SIZE 20
#define STACK_INCREMENT 10
#define MAXBUFFER 10
typedef double ElemType;
typedef double Status;

typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;

Status InitStack( SqStack *S )
{
S->base = ( ElemType *) malloc ( STACK_INIT_SIZE*sizeof( ElemType ) );
S->top = S->base ;
S->stacksize = STACK_INIT_SIZE;

return 0;
}

//插入元素e,即入栈
Status Push( SqStack *S , ElemType e )
{
if ( S->top - S->base >= S->stacksize ) //当前容量大于或等于最大容量
{
//追加栈的空间
S->base = ( ElemType *) realloc ( S->base, S->stacksize + STACK_INCREMENT*sizeof( ElemType ) );
if ( !S->base )
return -1;
S->top = S->base + S->stacksize ;
S->stacksize = S->stacksize + STACK_INCREMENT;

}
//开始赋值
*S->top = e;
S->top++;

return 0; //注意返回值为0,不是e
}

//弹出元素e,即出栈
Status Pop ( SqStack *S , ElemType *e )
{
//首先判断栈内是否为空
if ( S->top == S->base )
return -1 ;

--S->top ;
*e = *S->top ;

return *e; //注意返回值为e,不是0
}

int StackLen ( SqStack *S )
{
return ( S->top - S->base );
}

int main()
{
SqStack s;
double d,e;
char c;
char str[MAXBUFFER];
InitStack(&s);
int i=0;
printf("请按逆波兰表达式输入数据,运算符之间用空格符分开,以‘#‘作为结束符:\n");
scanf("%c",&c);
while(c!=‘#‘)
{
while(isdigit(c)||c==‘.‘)
{
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;
}
}
}
while(c!=‘#‘)
{
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(e!=0)
Push(&s,d/e);
else
{

printf("出错,除数不能为0");
return -1;}
break;
}
scanf("%c",c);
}

Pop(&s,&d);
printf("最终结果:%f\n",d);
return 0;
}

//由于时间匆忙,来不及设置格式,可能是复制的原因,见谅!

时间: 2024-07-30 13:40:01

逆波兰式,有关栈的问题的相关文章

将中缀式转化为逆波兰式 (栈)

逆波兰式:Reverse Polish notation,RPN,,也叫后缀表达式,将运算符写在操作数之后 数据结构:两个栈S1和S2.S1临时存储运算符,S2存储最终结果. 算法:(1)若取出的字符是操作数,则分析出完整的运算数,该操作数直接送入S2栈(2)若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符优先级大于S1栈栈顶运算符优先级,则将该运算符进S1栈,否则,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入

c# 逆波兰式实现计算器

语文不好,不太会组织语言,希望不要太在意. 如题,先简要介绍一下什么是逆波兰式  通常我们在写数学公式的时候  就是a+b+c这样,这种表达式称为中缀表达式,逆波兰式又称为后缀表达式,例如a+b 后缀表达式就为ab+ 而把中缀表达式转为逆波兰式也是很容易的,以下算法摘自百度百科 简要说一下栈,栈是一种先进后出的对象集合,可以把栈理解为一个桶,先进后出  Stack   Peek()是取出但是不剔除 做比较的时候用,Pop()是出栈,Push()入栈 首先需要分配2个栈,一个作为临时存储运算符的栈

数据结构——逆波兰式

很久没有关注算法和数据结构,大部分知识都已经忘记了:是时间好好回炉一下了,说实话干读数据机构这本书还是挺枯燥而且这本书原理性比较多,有一定的难度.这不刚看到逆波兰式废了好大劲才搞懂,老了... 逆波兰式 逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后) 一个表达式E的后缀形式可以如下定义: (1)如果E是一个变量或常量,则E的后缀式是E本身. (2)如果E是E1 op E2形式的表达式,这里op是如何二元操作符,则E的后缀

js实现 - 逆波兰式

没有任何方法,除非你才华横溢. --艾略特 js实现 - 逆波兰式 2019-05-26 by 文科生 最近编译原理实验有涉及到逆波兰式,而且听闻有人在前端面试过程中被问到逆波兰式算法的实现,之前的离散数学课程中也有涉及到逆波兰式,作为一名前端人员,终于按耐不住想用js去实现求逆波兰式的算法.我查阅了大量的资料,发现有的算法虽然基本实现了对应的功能,但在细节处理方面略显不妥:而有的算法写的过于庞杂,想要完全读懂则代价昂贵,而且代码的臃肿不是因为算法本身复杂,而是加入了一些算符,这对理解算法本质是

HDU1237 简单计算器 【栈】+【逆波兰式】

版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet att

栈应用——逆波兰式表达式的值

问题描述: 计算给定的逆波兰表达式(即后缀表达式)的值. 事实上,二元运算的前提下,中缀表达式可以对应一棵二叉树:逆波兰式即该二叉树后序遍历的结果. 分析思路: 如果当前是操作数,则直接入栈: 如果当前是操作符,则栈顶的两个元素弹出,然后与当前操作符运算后入栈. Code: /** * 给出一个逆波兰式,计算该表达式的值 * @param s * @return */ public int getTheValueOfRPN(String s) { char[] ch = s.toCharArra

栈的应用-逆波兰式

---恢复内容开始--- 普通的计算方式,也叫中缀表达式计算机识别及正确运用需要耗费大量的资源 23+45*2-(8+2) 计算机想要正确计算出此时的结果需要十分复杂,更何况情况十分多变. 逆波兰式:又叫做后缀表达式,它能去除中缀表达式的括号.十分符合计算机的计算思维,能极大提高效率 表达式不能用字符串进行存储,因为这将无法分辨,应用集合(ArrayList,LinkedList存储) 23 45 2 * 8 2 + - + 那么中缀表达式是如何变成后缀表达式的呢?原则如下: 1.首先把普通的表

使用逆波兰式进行表达式求值

中缀表达式及后缀表达式图解中说明了使用逆波兰式进行表达式求值的方法,这里使用C++进行实现.实现和原理讲解有一点不同,需要进一步进行细化. 关于将中缀表达式转换成后后缀表达式的规则: 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分:若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止. 上面的规则转换成下面的执行规则: 1.遇到操作数:直接输出(添加到后缀

逆波兰式与表达式求解

/*************** 逆波兰式即后缀表示法 预处理 ---- 中序表达式->逆序表达式(infix to postfix) 算法: while(表达式非空) if (遇到操作数) 直接输出 else if (遇到操作符op) op是( 直接入栈s op是) s.push输出,直到( op是四则运算,则 if (s为空 || s.top为( || op 优先级高于 s.top) op 入栈 else s.push输出 if (!s.empty) s.push输出 计算 算法: if (