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

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语言实现的简单的逆波兰计算器相关推荐

  1. 个人所得税计算器程序c语言,基于C语言实现的个人所得税纳税系统.docx

    摘要:随着现在人均收入水平的提高,人们对于和自己息息相关的税收的制度和数目更加的关心,尤其是个人所得税.但是很多人都不知道如何计算个人所得税,所以一款简单易行的计算个人所得税的软件是十分必要的:而现在 ...

  2. c语言课程设计加密程序,C语言课程设计文件加密解密.doc

    C语言课程设计文件加密解密 C语言程序设计 课程设计 学 院 计算机工程 班 级 计算1313 姓 名 学 号 201321121089 成 绩 指导老师 2014年6月26日 计算1313班C语言程 ...

  3. python是语言还是软件_程序开发语言之Python:是追逐还是坚守?

    Python作为计算机程序设计语言的其中一种,最初是被设计用于编写自动化脚本(shell),随着版本的不断更新.语言新功能的添加和机器学习的兴起,Python从2017年开始受到广泛关注. Pytho ...

  4. c语言经典解决实际程序,C语言经典教程1讲.ppt

    <C语言经典教程1讲.ppt>由会员分享,可在线阅读,更多相关<C语言经典教程1讲.ppt(48页珍藏版)>请在人人文库网上搜索. 1.C程序设计,主讲人:任祖华,2,本课程学 ...

  5. c语言怎么返回前一个程序,c语言return返回到哪

    c语言return返回到哪 c语言return,返回给了上一级,比如一个递归程序,从第三层返回到第二层:又比如一个普通的子程序,那就返回到主程序中去. 主程序中return返回给了操作系统. 比如下面 ...

  6. c语言逆波兰计算器程序,c语言实现逆波兰计算器

    最近学算法学到了栈 写了一个典型例子逆波兰计算器.用很像链表的形式写的下面来看思路. 首先要做的是一个栈的模型具有压栈和出栈的功能 #include #include #define MAX_S 20 ...

  7. 用c语言switch编写加减乘除程序,超级新手,用switch写了个计算器程序,求指导...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我也写过一个....看样子大家都喜欢用 switch()来写计算机 ....百度排版是渣渣!!!!! # include intmain(void){ d ...

  8. C语言逆序数的程序,C语言实现逆序数

    逆序数的就是把一个数倒过来,例如:1234那么它的逆序数就为4321,我们该如何是实现呢?当初我是先求出它的位数,接着求余数,余数再乘上所对应的的10的次方,其实10的次方也有专门的函数pow(). ...

  9. c语言50个小程序,C语言50小程序.doc

    C语言50小程序 一 基础部分: 输入1~10之间的一个数字,输出它对应的英文单词. /* Note:Your choice is C IDE */ #include "stdio.h&qu ...

最新文章

  1. 营销 | 10个助燃商业增长的市场营销战略!
  2. .NET Core 又一杀器! Web Blazor框架横空出世!
  3. java集合——具体的集合
  4. PowerDesigner15在win7-64位系统下对MySQL 进行反向工程以及建立物理模型产生SQL语句步骤图文傻瓜式详解...
  5. Linux CentOs6 命令学习
  6. 如何使用Linux重置Windows密码
  7. MTK 驱动开发(27)---TP 驱动分析
  8. Python demjson 下载并安装
  9. IMF:央行须变得更像苹果公司以保证央行数字货币处在技术前沿
  10. 富文本 NSAttributedString
  11. android中的ActionBar和ToolBar
  12. 20155213 实验三《敏捷开发与XP实践》实验报告
  13. Windows 更新安装 Windows 7 SP1失败错误代码80073712解决方法:
  14. Python运行jieba出现Building prefix dict from the default dictionary ...解决办法(会显示正确结果)
  15. matlab显示英文字母,#EXCEL函数判断是数字还是字母#excel表格列显示字母
  16. ifc文件转换成obj和mtl文件
  17. xlwt对excel表的写入操作
  18. 616 java实现发红包案例
  19. 微商怎么通过QQ引流?微商如何利用QQ加人?微商QQ引流技巧
  20. python自学-class20-爬取东方财富网股票数据(爬虫)

热门文章

  1. Android播放器之SurfaceView与GLSurfaceView
  2. 关于tomcat启动失败的一个原因
  3. @RequestBody 和 @RequestParam可以同时使用
  4. SXSSFWorkbook使用——使用excel模板
  5. 编辑流程图_流程图不会绘制?一分钟手把手教你学会,超简单
  6. python3 tkinter详解_python tkinter基本属性详解
  7. 代码里无图片地址_项目实战:爬高清图片
  8. go 写文件_如何在 Ubuntu 20.04 上安装 Go
  9. Java 多线程 —— ReentrantLock 与 Condition
  10. 设计模式---观察者模式介绍与理解