c语言逆波兰计算器程序,C语言实现的简单的逆波兰计算器

前后调试了好几天,类型转换问题颇为麻烦,无赖使用两种不同类型的栈解决,但程序目前还有两个问题:

1.目前不能进行float类型的计算;

2.不能进行多位数的运算。

实际上就是目前只能进行个位数的带括号的加减乘除运算,目前只能写到这一步,期待后续改进。

#include

#include

#include

#define CAPACITY 50

typedef struct stack

{

int top;

char arr[CAPACITY];

}*pStack,stack;

pStack initStack1()

{

pStack st = (pStack)malloc(sizeof(stack));

st->top = 0;

return st;

}

int stackEmpty1(pStack st)

{

return(st->top <= 0);

}

int stackFull1(pStack st)

{

return(st->top >= CAPACITY);

}

int pushStack1(pStack st, char a)

{

if(stackFull1(st))

{

printf("栈满!\n");

return 0;

}

else

{

st->arr[st->top++] = a;

return 1;

}

}

char popStack1(pStack st)

{

char a;

if(stackEmpty1(st))

{

printf("栈空!\n");

return 0;

}

else

{

a = st->arr[--st->top];

return a;

}

}

char getTop1(pStack st)

{

if(!stackEmpty1(st))

return st->arr[st->top-1];

else

printf("Empty stack");

return 0;

}

typedef struct

{

int top;

int data[CAPACITY];

}*dataStack;

dataStack initStack2()

{

dataStack st = (dataStack)malloc(sizeof(dataStack));

st->top = 0;

return st;

}

int stackEmpty2(dataStack st)

{

return(st->top <= 0);

}

int stackFull2(dataStack st)

{

return(st->top >= CAPACITY);

}

int pushStack2(dataStack st, int data)

{

if(stackFull2(st))

{

printf("栈满!\n");

return 0;

}

else

{

st->data[st->top++] = data;

return 1;

}

}

int popStack2(dataStack st)

{

int data;

if(stackEmpty2(st))

{

printf("栈空!\n");

return 0;

}

else

{

data = st->data[--st->top];

return data;

}

}

int getTop2(dataStack st)

{

if(!stackEmpty2(st))

return st->data[st->top-1];

else

printf("Empty stack");

return 0;

}

int priority(char op)

{

switch(op)

{

case '*':

case '/':return 2;

case '+':

case '-':return 1;

default: return 0;

}

}

int myAtoi(char a)

{

return a-'0';

}

int main(void)

{

int p = 0;

int i = 0;

int j;

int result, tmp1, tmp2;

char ch, temp;

char infix[CAPACITY] = "\0";

char output[CAPACITY];

pStack st = initStack1();

dataStack st2 = initStack2();

printf("请输入中缀表达式:");

scanf("%s", &infix);

printf("后缀表达式为:");

for(ch = infix[p];ch !='\0';ch = infix[++p])

{

switch(ch)

{

case '(':pushStack1(st,ch);break;

case ')':

{

while(getTop1(st) != '(')

{

output[i++] = getTop1(st);

printf("%c", popStack1(st));

}

popStack1(st);

break;

}

case '+':

case '-':

case '*':

case '/':

{

while(!stackEmpty1(st))

{

temp = getTop1(st);

if(priority(temp) >= priority(ch))

{

output[i++] = temp;

printf("%c", popStack1(st));

}

else

{

break;

}

}

pushStack1(st, ch);

break;

}

default:output[i++] = ch,printf("%c",ch);

}

}

while(!stackEmpty1(st))

{

temp = popStack1(st);

output[i++] = temp;

if(temp == '(')

{

printf("表达式有误!");

exit(EXIT_FAILURE);

}

printf("%c", temp);

printf("\n");

}

output[i] = '\0';

free(st);

for(j=0;j

{

switch(output[j])

{

case'+':tmp1 = popStack2(st2);tmp2 = popStack2(st2);result = tmp1 + tmp2;pushStack2(st2, result);break;

case'-':tmp1 = popStack2(st2);tmp2 = popStack2(st2);result = tmp2 - tmp1;pushStack2(st2, result);break;

case'*':tmp1 = popStack2(st2);tmp2 = popStack2(st2);result = tmp2 * tmp1;pushStack2(st2, result);break;

case'/':tmp1 = popStack2(st2);tmp2 = popStack2(st2);result = tmp2 / tmp1;pushStack2(st2, result);break;

default:pushStack2(st2,myAtoi(output[j]));break;

}

}

printf("输出结果为: %d\n", getTop2(st2));

return 0;

}两种堆栈可以用泛型实现共用函数,目前还不清楚怎么实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言竞赛成绩排序,吧内编程竞赛:成绩公布

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼第二第三题太狡猾了第二题居然有重复的路……怪不得只通过30%……第三题居然可以只吃一部分(一直以为要吃完&#xff0c;题目看上去也是这样)第一题因为输入的数极差不大&#xff0c;可以用数组(大小为 (极差1))存放#includeint a[…

avr单片机led数码管六位动态显示时分秒c语言程序,AVR单片机控制8段LED数码管同时显示 - AVR单片机8位数码管显示的程序实现(两种方法介绍)...

AVR单片机控制8段LED数码管同时显示这是一个简单的供单片机入门学习者练习用的8段LED数码管控制汇编程序&#xff0c;控制一个两位的数码管同时显示字符(动态刷新)。用AVR- Studio-4 开发&#xff0c;在AVR单片机Atmega48上调试通过。学习者可以举一反三应用到其他类型的单片机…

C语言程序设计与有限元,C语言与有限元程序设计.pdf

C语言与有限元程序设计.pdfC语言与有限元程序设计叶 又 戚 燕(上海交通大攀国家棋其C几D工程中心 上海加0030) (上海大学计算中心 上海匆印力摘 要 本文通过与FORTRAN77语官的比较&#xff0c;说明利用C语言开发有限元程序的可行性。结果表明,C语官不但完全可以实现FORTRAN77的…

c语言gets n,c语言中gets ,getschar 和fgets 的用法及三者之间的差别

满意答案wkmpbg846推荐于 2018.02.27采纳率&#xff1a;45% 等级&#xff1a;8已帮助&#xff1a;362人gets():原型:char *gets(char *buffer) ;功能:从stdlin中获取获取字符串一直到换行符或者遇到EOF为止&#xff0c;但换行符不被录取&#xff0c;会将换行符替换成‘\0’来…

南工院linux考试题库,操作系统复习题..doc

操作系统复习题.第一章 操作系统概述学习指导:本章主要介绍操作系统的基本概念、特性和分类&#xff0c;从操作系统的地位和作用两个方面给出了操作系统的描述性定义。读者应当注意操作系统程序的特殊性&#xff0c;以及操作系统与硬件和其它软件之间的关系&#xff0c;理解操作…

android电话系统,Android电话系统之-rild.doc

Android电话系统之-rild.docAndroid电话系统之-rildRild是Init进程启动的一个本地服务&#xff0c;这个本地服务并没有使用Binder之类的通讯手段&#xff0c;而是采用了socket通讯这种方式。RIL(Radio Interface Layer)Android 给出了一个ril实现框架。由于Android开发者使用的…

android出现错误,在做一个安卓的一个登陆操作的时候,出现错误

源代码如下&#xff1a;/**//*author Administrator**/package com.example.login;//import org.testng.annotations.Test;//import org.testng.annotations.BeforeClass;//import org.testng.annotations.AfterClass;import io.appium.java_client.AppiumDriver;import io.app…

android中svn插件安装,AndroidSDK安装SVN插件问题解决

工具版本信息:Eclipse4.2ADT23.0Subclipse1.10,插件安装地址:http://subclipse.tigris.org/update_1.10.x问题一报错信息如下:Cannot complete the install because one or more required items could not be found.Software being installed: Subversion Revision Graph 1.1.1…

android 点击空白退出,Android 点击空白处隐藏键盘

方法一&#xff1a;使用android的分发机制(代码稍微有点多)/*** 实现点击空白处&#xff0c;软键盘消失事件* param ev* return*/Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if (ev.getAction() MotionEvent.ACTION_DOWN) {// 获得当前得到焦点的View&#…

鸿蒙系统的变化,鸿蒙系统没变化的背后

原标题&#xff1a;鸿蒙系统没变化的背后鸿蒙系统发布以后被很多人吐槽&#xff0c;说是没什么变化&#xff0c;和之前体验的安卓系统简直一模一样&#xff0c;真的失望至极。其实&#xff0c;鸿蒙系统还是从底层做出了改变&#xff0c;只不过没有变了界面和运行方式而已。那么…

三星s2 硬刷Android 8,三星T710(GALAXY Tab S2 8.0)一键救砖教程,轻松刷回官方系统...

三星T710(GALAXY Tab S2 8.0)手机变砖了怎么办?对于经常刷机的安卓玩家来说&#xff0c;碰到刷机失败导致三星T710(GALAXY Tab S2 8.0)手机无法启动甚至无法进入recovery都是在所难免的事&#xff0c;这个时候我们就需要用到奇兔线刷大师线刷救砖功能了&#xff0c;它能轻松实…

鸿蒙工业互联网,工业互联网 3D 展示平台

原标题&#xff1a;工业互联网 3D 展示平台项目简介产业园区占地约为 158.46 亩&#xff0c;现有生产车间两栋、研发楼一栋、检测楼一栋、食堂及倒班楼一栋、废品库一栋、门卫室两处、综合站房一处。主要从事电缆、电线的生产与加工。产业园区综合管理平台项目开发内容复杂&…

基于android的交流平台,基于Android的移动学习交流平台的设计与实现

摘要&#xff1a;随着移动互联网技术的不断发展,智能手机的不断普及,现在越来越多的人通过手机等智能设备来进行学习和交流。为了满足教师和学生实时的沟通交流,提高学生的学习兴趣和效率,本文设计了基于Android的移动学习交流系统。本文首先通过Openfire完成了客户端与服务器端…

weex监听android返回键,weex使用手册

Native DOM APIsUpdated time: 14/06/2017Weex 在 JS 引擎中&#xff0c;为每个页面都提供了一套 Native DOM APIs&#xff0c;这套接口和 HTML DOM APIs 非常接近&#xff0c;利用这套接口我们可以通过 JavaScript 控制 native 的渲染逻辑。而且 Weex 上层的 Vue 2.0 也是基于…

lean软件Android有吗,leanchat-android

LeanChat Android 客户端简介LeanChat 是 LeanCloud 实时通信 组件的 Demo&#xff0c;通过该应用你可以学习和了解 LeanCloud 实时通信功能。效果截图Leanchat 项目构成如果你从 github clone 速度很慢&#xff0c;可以从 这里 下载项目源码压缩包。部署创建应用注册并登录 Le…

华为系统10.0是鸿蒙吗,暂时忘记鸿蒙!华为EMUI 10.0发布时间确认:这才是主角...

原标题&#xff1a;暂时忘记鸿蒙&#xff01;华为EMUI 10.0发布时间确认&#xff1a;这才是主角华为鸿蒙系统由于顶着“自研”的光环&#xff0c;自曝光以来便受到科技圈的追捧&#xff0c;虽并未推出但已经有“众星捧月”的迹象。媒体追逐鸿蒙系统自然是为了热度和流量&#x…

a4纸在html的像素,打印常识:A4纸张在显示器上应该要多少像素?

A4纸的尺寸是210mm*297mm&#xff0c;也就是21.0cm*29.7cm&#xff0c;而1英寸2.54cm&#xff0c;如果屏幕DPI分辨率为72像素/英寸&#xff0c;换算一下&#xff1a;相当于1cm可呈现 (72px/2.54cm) 28.34px下面是一些常用分辨率下A4纸在屏幕上的像素尺寸&#xff1a;分辨率是7…

用HTML编写教学评估系统,在线教学质量评价系统的设计与实现

《在线教学质量评价系统的设计与实现.doc》由会员分享&#xff0c;可免费在线阅读全文&#xff0c;更多与《在线教学质量评价系统的设计与实现》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。1、MWEAVERMA入门与提高[M]清华大学出版社&#xff0c;[]李国涛SQLS…

微型计算机方面的论文,微型计算机论文.doc

计算机指令系统与中国CPU的发展本学期我们大致了解了一些微型计算机的基本原理&#xff0c;包括微机处理器、微型计算机和微型计算机系统的定义、微处理器的发展概况&#xff0c;以及微机处理器的分类。其中我们比较全面的学习了指令系统一 计算机指令系统1 计算机指令系统的发…