mysql视频 Anaconda Appuim环境搭建 maven WebService 希腊字母 codeigniter sharepoint progressjs vue下载 前端vue框架 react视频教程 广告投放系统源码 mac虚拟打印机 微信pc版无法获取二维码 spring源码下载 完全去vm去虚拟化工具 python界面 python编程题 javaqueue java教学 java删除数组元素 java语法 java获取年份 java数组扩容 java使用正则表达式 java怎么配置 java基本数据结构 java获取当前ip java定义接口 java时间戳转换 java目录 java中instanceof java比较字符串 linuxls命令 linux系统安装教程图解 linux内核编程 m4a转mp3格式转换器 h370主板 winhex使用教程
当前位置: 首页 > 学习教程  > 编程语言

用栈结构实现逆波兰计算器

2021/2/13 16:19:10 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

“”" 1、实现对逆波兰输入的表达式进行计算2、支持带小数点的数据3、正常的表达式 --> 逆波兰表达式ab ---> a b a(b-c) ---> a b c - a(b-c)*d ---> a b c - d * “”" C语言代码 #include<stdio.h> #include<ctype.h> #include<…

“”"

	1、实现对逆波兰输入的表达式进行计算
	2、支持带小数点的数据
	3、正常的表达式  -->  逆波兰表达式
	a+b  --->  a b +
	a+(b-c)  ---> a b c - +
	a+(b-c)*d ---> a b c - d * +

“”"

C语言代码

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

#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#define MAXBUFFER 10


#define OK 1
#define ERROR -1

typedef double ElemType;
typedef int Status;
typedef struct
{
    ElemType *base;
    ElemType *top;
    int stackSize;
}sqStack;

Status InitStack(sqStack *s){
    s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if(!s->base){
        return ERROR;
    }

    s->top = s->base;
    s->stackSize = STACK_INIT_SIZE;
    return OK;
}

Status Push(sqStack *s,ElemType e){
    //如果栈满,追加空间
    if(s->top - s->base >= s->stackSize){
        s->base = (ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType));
        if(!s->base){
            return ERROR;
        }
        s->top = s->base+s->stackSize;
        s->stackSize+=STACKINCREMENT;
    }
    *(s->top)=e;
    s->top++;
}

Status Pop(sqStack *s,ElemType *e){
    if(s->top==s->base){
        return ERROR;
    }

    *e=*--(s->top);
}

int StackLen(sqStack * s){
    return (s->top - s->base);
}

int main(){
    sqStack s;
    char c;
    double d,e;
    /*定义缓冲区*/
    char str[MAXBUFFER];
    int i=0;

    InitStack(&s);

    printf("请安逆波兰表达式输入计算数据,数据之间用空格隔开,以#作为结束标志:\n");
    scanf("%c",&c);

    while (c!='#')
    {
        /*用于过滤数据|判断字符是否是数字*/
        while (isdigit(c)|| c=='.')
        {
            str[i++] = c;
            str[i] = '\0';
            if(i>=10){
                printf("出错:输出的数字位数过长!\n");
                return ERROR;
            }
            scanf("%c",&c);

            if(c == ' '){
                /* atof
                功能:把字符串转换成浮点数
                */
                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(e!=0){
                        Push(&s,d/e);
                    }else{
                        printf("错误:分母不能为0\n");
                        return ERROR;
                    }
                    
                    break;
        default:
            break;
        }
        scanf("%c",&c);
    }

    /*打印最后结果*/
    Pop(&s,&d);
    printf("\n最后结果为:%lf\n",d);
    
    return 0;
}

/*
5 + (6 + 4) * 8 + 9 / 3
5 6 4 + 8 * 9 3 / + +

5 + 10*8 + 3
*/

效果:

在这里插入图片描述


本文链接: http://www.dtmao.cc/news_show_700010.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?