逆波兰计算器

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>

#define IncreSize 10
#define InitSize 10

typedef int status;
typedef int Elemtype;

typedef struct sStack
{
    Elemtype *base;
    Elemtype *top;
    int StackSize;
}sqStack;

void InitStack(sqStack *s)
{
    s->base = (Elemtype *)malloc(sizeof(int)*InitSize);
    if(!s->base)
        exit(0);
    else
    {
        s->top = s->base;
        s->StackSize = InitSize;
        //return OK;
    }
}

void Push(sqStack *s, Elemtype e)
{
    if(s->top - s->base >= s->StackSize)
    {
        s->base = (Elemtype *)realloc(s->base,(s->StackSize + IncreSize)*sizeof(Elemtype));  //这里申请的大一些的空间;
        if(!s->base)
            exit (0);
    }
    *(s->top) = e;
    s->top++;
    //return OK;
}

void Pop(sqStack *s, Elemtype *e)
{
    if(s->top == s->base)
        exit(0);
    *e = *--(s->top);
   // return OK;
}

int StackLen(sqStack s)
{
    return(s.top - s.base);   //注意这里的结果是栈中的数据个数;
}

//输入数字,然后根据计算法则进行求解。
int main()
{
    char c;
    char str[20];         //设立一个缓冲区;
    int i = 0;
    int d,e,f;
    sqStack s;
    InitStack(&s);
    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;
            }
        }
        switch(c)
        {
            case ‘+‘ :
                Pop(&s, &e);
                Pop(&s, &f);
                Push(&s,e+f);
                break;
            case ‘-‘:
                Pop(&s, &e);
                Pop(&s, &f);
                Push(&s,f-e);
                break;
            case ‘*‘:
                Pop(&s, &e);
                Pop(&s, &f);
                Push(&s,e*f);
                break;
            case ‘/‘:
                Pop(&s, &e);
                Pop(&s, &f);
                if(f == 0)
                    exit(0);
                Push(&s,e/f);
                break;
        }
        scanf("%c",&c);
    }
    Pop(&s,&e);
    printf("%d",e);
    return 0;
}

这个程序还是有些地方刚刚开始细节没有考虑清楚。

时间: 2024-10-05 04:43:24

逆波兰计算器的相关文章

中缀输入逆波兰计算器程序part1

在看K&R的时候,里面提到了逆波兰表示法,老实说看得我迷迷糊糊的,主要是这种反人类的后缀表示法做出的计算器,一般人根本就不知道怎么输入好吧.今天看书的时候,看到了将中缀表达式转为后缀表达式的方法才恍然大悟,原来是少了这一步.这下我就知道该如何做一个可用的逆波兰计算器了. 先简单介绍一下如何完成这步转换吧.中缀表达式就是我们习惯的表达式,比如:1+2*3 考虑运算符优先级的话后缀表达式则应该写成123*+ 写成后缀表达式的形式后我们可以利用栈轻松地解决计算问题,思路是当见到一个数时就把它推入栈:在

09 - 逆波兰计算器

1. 前缀表达式 (波兰表达式) 前缀表达式的运算符位于操作数之前 [举例说明] (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 和 次顶元素),并将结果入栈:重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果 [举例说明]针对上例的前缀表达式求值步骤如下(栈顶 ? 次顶): 从右至左扫描,将6.5.4.3压入堆栈 遇到

栈实现综合计算器(中缀表达式),前缀,中缀,后缀表达式,逆波兰计算器

思路: 代码:实现多位数的运算 public class Calculator { public static void main(String[] args) { //根据前面老师思路,完成表达式的运算 String expression = "7*2*2-5+1-5+3-4"; // 15//如何处理多位数的问题? //创建两个栈,数栈,一个符号栈 ArrayStack2 numStack = new ArrayStack2(10); ArrayStack2 operStack =

后缀表达式(逆波兰表达式)计算器

package datastructure.stack; import java.util.*; /** * <h3>netty_lecture</h3> * <p>逆波兰计算器</p> * 1+((2+3)*4)-5 ==> 1 2 3 + 4 * + 5 1 * @author : myron * @date : 2020-03-18 23:48 **/ public class PolandNotation { private static fi

逆波兰式(后缀表达式)的计算

输入 :后缀表达式(可带浮点数) 输出:double型的计算结果 代码: #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define ElemType double #define Stack_Init_Size 100 #define Increase_Size 10 #define MaxBuffer 10 typedef struct sqStack { ElemType *top; Ele

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

逆波兰法(计算器)程序&lt;无符号版&gt;

涉及队列.栈的运用. Java中队列可以用: Queue<String> q = new LinkedList(); 来声明,其主要的方法有: poll(),peak(),offer(),clear(),size()等. Java中栈可以用: Stack s = new Stack(); 来声明,其主要方法有:push(),peak(),pop(),clear(),size()等. 1 package preTest; 2 3 import java.util.LinkedList; 4 im

c# 逆波兰式实现计算器

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

[从今天开始修炼数据结构]栈、斐波那契数列、逆波兰四则运算的实现

一.栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表.允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom).栈又称后进先出的线性表,简称LIFO结构. 注意:首先它是一个线性表,也就是说栈元素有前驱后继关系. 栈的插入操作,叫做进栈,也称压栈.入栈 栈的删除操作,叫做出栈,也叫弹栈. 注意:最先入栈,不代表就要最后出栈.因为栈没有限制出栈的时间,例如可以先入栈两个元素,再出栈两个元素,后入栈其他元素. 二.栈的抽象数据类型 ADT Stack Data 同线性表.元素具有相