最近学算法学到了栈 写了一个典型例子逆波兰计算器。用很像链表的形式写的下面来看思路。

首先要做的是一个栈的模型具有压栈和出栈的功能

#include

#include

#define MAX_S 20

#define add 10

typedef double elem;

typedef struct node //为了方便修改 用了别名

{

elem *top; // 栈顶

elem *end; // 栈底

int length;// 长度

} Stack;

void create(Stack *e) //初始化栈

{

e->end = (elem *)malloc(MAX_S * sizeof(elem));

if(!e->end)

{

exit(0);

}

e->top = e->end;

e->length = MAX_S;

}

void push(Stack *e,elem s) //压栈

{

if(e->top-e->end>=e->length) //判断是否溢出 溢出则增加栈长度

{

e->end = (elem *)realloc(e->end,(e->length+add)*sizeof(elem));

if(!e->end)

{

exit(0);

}

}

*(e->top) = s;

e->top++;

}

void pop(Stack *e,elem *p) //出栈

{

if(e->top==e->end)

{

return;

}

e->top--;

*p = *(e->top);

// printf("%f",*p);

}

基本结构差不多就完成了 因为是动态栈运用了realloc来扩展空间,而且c语言比我想象地要智能,结构体指针相减得到的是相差多少个数据类型的值前提是类型要相等。

int size(Stack e) // 计算栈的长度

{

return (e.top-e.end);

}

void consolo(Stack *e) //输出栈中数据

{

Stack *pr = e;

pr->top = e->top;

int i = size(*e);

for(;i>=0;i--)

{

printf("%f\n",*(pr->top));

(pr->top)--;

}

}

这两个方法都是我在调试期间用的可以查看栈的长度和栈中数据

int isnumber(char e) //判断ascii是否为数字

{

if(e>=48 && e<=57)

{

return 1;

}

else

{

return 0;

}

}

int main()

{

char test[add]={'\0'}; //数字缓冲区

int i=0;

char s;

double c1,c2,answer;

Stack stack;

create(&stack);

printf("输入逆波兰表达式数字和操作符用空格隔开最后以#结束\n");

do{

scanf("%c",&s);

while(isnumber(s) || s=='.') //转换为数字压入栈中

{

test[i] = s;

if(i>add){

printf("输入的单个数字长度过大!");

return -1;

}

i++;

scanf("%c",&s);

if(s == ' '){

c1 = atof(test);

push(&stack,c1);

i=0; //置空计数器

break;

}

}

switch(s)

{

case '+':

// consolo(&stack);

pop(&stack,&c1);

pop(&stack,&c2);

push(&stack,c2+c1);

break;

case '-':

pop(&stack,&c1);

pop(&stack,&c2);

push(&stack,c2-c1);

break;

case '*':

pop(&stack,&c1);

pop(&stack,&c2);

push(&stack,c2*c1);

break;

case '/':

pop(&stack,&c1);

pop(&stack,&c2);

if(c1==0){

printf("被除数不能为0");

return -1;

}

push(&stack,c2/c1);

break;

}

}while(s!='#');

pop(&stack,&answer);

printf("%f\n",answer);

return 0;

}

这就是主体了 因为有操作符的缘故所以不能直接使用整形或浮点型来控制 当遇到操作符的时候最好的方法就switch 然后通过空格来控制压入栈的数据以#来结束输入

ps. 因为太菜被出栈的指针坑了好一会 才发现要先减掉 栈顶指针永远指的空

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语言制作简单五子棋游戏

    原标题:C语言制作简单五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是不 ...

  7. 计算器程序java开方运算_模拟计算器java程序

    1 /*实现基本数学运算.函数等功能:加.减.乘.除.阶乘.正弦.余弦和指数运算.2 界面将模拟Windows中的计算器程序.*/ 3 import javax.swing.*;4 import ja ...

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

    前后调试了好几天,类型转换问题颇为麻烦,无赖使用两种不同类型的栈解决,但程序目前还有两个问题: 1.目前不能进行float类型的计算: 2.不能进行多位数的运算. 实际上就是目前只能进行个位数的带括号 ...

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

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

最新文章

  1. python目标检测与识别_Python 使用Opencv实现目标检测与识别的示例代码
  2. Oracle中默认创建的表
  3. 一张图看懂CSS cascade, specific, importance, inheritance
  4. FPGA设计中RAM的一些基本概念
  5. python schedule运行了一遍说没有任务_python-schedule模块(定时任务)基于官方文档总结...
  6. 如何绘制吞吐率曲线图
  7. python上下文管理器细读
  8. python turtle绕原点旋转_「加德老师与小朋友们的编程之旅」Python海龟作图(上)
  9. Centos 7 学习加入用户
  10. steam第三方授权登录不稳定(openid4java)
  11. eclipse配置jsp页面模板
  12. html 一键发送给微信朋友圈,微信朋友圈如何转发别人说说(朋友圈一键集赞神器)...
  13. php微信转发无法显示标题图片,解决微信公众号分享朋友圈不显示标题图片描述的方法...
  14. 面试题: !=!=未看12 略多 sql语句练习 非常 有用
  15. PyQt4实时显示文本内容GUI
  16. 【运筹学】对偶理论 : 影子价格 ( 对偶问题的经济解释 )
  17. 从志愿军“断刀”再论敏捷之道(上篇)
  18. 喂,你要多吃点含乳酸菌的食品
  19. 肿瘤细胞膜包裹纳米颗粒|MIA-PaCa-2胰腺癌细胞膜纳米金颗粒|使用周期:6-12个月
  20. Azure基础:什么是云计算(2) NIST云计算模型定义

热门文章

  1. php 清除浮动,清除浮动的方法 - 前端宅男的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. 分页查询,但是页面只重复显示一条数据
  3. VirtualBox 更改主机和虚拟机之间的鼠标切换热键
  4. 数据分析 | SVM模型
  5. ZYNQ-AXI_VDMA IP简介
  6. Symfony2学习笔记之数据库操作
  7. 【交通标志识别】基于matlab HOG特征机器学习交通标识识别【含Matlab源码 2200期】
  8. slurm 安装使用(centos7)
  9. Winform 执行完 KeyPress后TextBox 文本多出来回车键符号(vbCrLf)解决方案
  10. 基于spss的多元统计分析 之 实例3(血压、胆固醇于心脏病关系的研究)(8/8)