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;
}两种堆栈可以用泛型实现共用函数,目前还不清楚怎么实现。
c语言逆波兰计算器程序,C语言实现的简单的逆波兰计算器相关推荐
- 个人所得税计算器程序c语言,基于C语言实现的个人所得税纳税系统.docx
摘要:随着现在人均收入水平的提高,人们对于和自己息息相关的税收的制度和数目更加的关心,尤其是个人所得税.但是很多人都不知道如何计算个人所得税,所以一款简单易行的计算个人所得税的软件是十分必要的:而现在 ...
- c语言课程设计加密程序,C语言课程设计文件加密解密.doc
C语言课程设计文件加密解密 C语言程序设计 课程设计 学 院 计算机工程 班 级 计算1313 姓 名 学 号 201321121089 成 绩 指导老师 2014年6月26日 计算1313班C语言程 ...
- python是语言还是软件_程序开发语言之Python:是追逐还是坚守?
Python作为计算机程序设计语言的其中一种,最初是被设计用于编写自动化脚本(shell),随着版本的不断更新.语言新功能的添加和机器学习的兴起,Python从2017年开始受到广泛关注. Pytho ...
- c语言经典解决实际程序,C语言经典教程1讲.ppt
<C语言经典教程1讲.ppt>由会员分享,可在线阅读,更多相关<C语言经典教程1讲.ppt(48页珍藏版)>请在人人文库网上搜索. 1.C程序设计,主讲人:任祖华,2,本课程学 ...
- c语言怎么返回前一个程序,c语言return返回到哪
c语言return返回到哪 c语言return,返回给了上一级,比如一个递归程序,从第三层返回到第二层:又比如一个普通的子程序,那就返回到主程序中去. 主程序中return返回给了操作系统. 比如下面 ...
- c语言逆波兰计算器程序,c语言实现逆波兰计算器
最近学算法学到了栈 写了一个典型例子逆波兰计算器.用很像链表的形式写的下面来看思路. 首先要做的是一个栈的模型具有压栈和出栈的功能 #include #include #define MAX_S 20 ...
- 用c语言switch编写加减乘除程序,超级新手,用switch写了个计算器程序,求指导...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我也写过一个....看样子大家都喜欢用 switch()来写计算机 ....百度排版是渣渣!!!!! # include intmain(void){ d ...
- C语言逆序数的程序,C语言实现逆序数
逆序数的就是把一个数倒过来,例如:1234那么它的逆序数就为4321,我们该如何是实现呢?当初我是先求出它的位数,接着求余数,余数再乘上所对应的的10的次方,其实10的次方也有专门的函数pow(). ...
- c语言50个小程序,C语言50小程序.doc
C语言50小程序 一 基础部分: 输入1~10之间的一个数字,输出它对应的英文单词. /* Note:Your choice is C IDE */ #include "stdio.h&qu ...
最新文章
- 营销 | 10个助燃商业增长的市场营销战略!
- .NET Core 又一杀器! Web Blazor框架横空出世!
- java集合——具体的集合
- PowerDesigner15在win7-64位系统下对MySQL 进行反向工程以及建立物理模型产生SQL语句步骤图文傻瓜式详解...
- Linux CentOs6 命令学习
- 如何使用Linux重置Windows密码
- MTK 驱动开发(27)---TP 驱动分析
- Python demjson 下载并安装
- IMF:央行须变得更像苹果公司以保证央行数字货币处在技术前沿
- 富文本 NSAttributedString
- android中的ActionBar和ToolBar
- 20155213 实验三《敏捷开发与XP实践》实验报告
- Windows 更新安装 Windows 7 SP1失败错误代码80073712解决方法:
- Python运行jieba出现Building prefix dict from the default dictionary ...解决办法(会显示正确结果)
- matlab显示英文字母,#EXCEL函数判断是数字还是字母#excel表格列显示字母
- ifc文件转换成obj和mtl文件
- xlwt对excel表的写入操作
- 616 java实现发红包案例
- 微商怎么通过QQ引流?微商如何利用QQ加人?微商QQ引流技巧
- python自学-class20-爬取东方财富网股票数据(爬虫)
热门文章
- Android播放器之SurfaceView与GLSurfaceView
- 关于tomcat启动失败的一个原因
- @RequestBody 和 @RequestParam可以同时使用
- SXSSFWorkbook使用——使用excel模板
- 编辑流程图_流程图不会绘制?一分钟手把手教你学会,超简单
- python3 tkinter详解_python tkinter基本属性详解
- 代码里无图片地址_项目实战:爬高清图片
- go 写文件_如何在 Ubuntu 20.04 上安装 Go
- Java 多线程 —— ReentrantLock 与 Condition
- 设计模式---观察者模式介绍与理解