有一句计算机界中的至理名言:

程序=数据结构+算法

可见数据结构是多么地重要啊......呵呵

今天开始复习了一下数据结构 , 解决了以前的一个问题:

用栈这个数据结构实现四则运算

算法思想是借鉴了<>(清华大学出版社 严蔚敏)中的一些思想 , 最原始的算法就是波兰一位逻辑学家的逆波兰表示法

也就是讲中缀表达式转为后缀表达式的算法 , 感觉很强大 ,  呵呵......

好了F话就不多说了 , 直接上代码吧()

算法核心代码:

/*算术表达式求值算法*/

int CountExpression()

{

LinkStack Ope, Num;//操作符栈和操作数栈

char a,b,c,chOpe;

InitStack(&Ope);//初始化符号栈

Push(&Ope, '#');//因为输入中包含# 于是先压一个# 用于判断是否结束

InitStack(&Num);//初始化操作数栈

c = getchar();

//读取遇到#或操作符栈顶为# 就表示结束运算

while(c != '#' || GetTop(&Ope) != '#')

{

//如果是操作数(小于10的一位数) 就压入操作数栈

if(c>= '0' && c<= '9')

{

Push(&Num, c);

c = getchar();

}

//压入操作符栈

else

{

switch(Judge(GetTop(&Ope), c))

{

case '

Push(&Ope, c);

c = getchar();

break;

case '='://当遇到右括号时 就出括号, 并接收下一个字符

Pop(&Ope);

c = getchar();

break;

case '>'://栈顶的操作符优先级高 , 说明需要运算 , 并将计算结果压入操作数栈中

chOpe = Pop(&Ope);

a = Pop(&Num);

b = Pop(&Num);

Push(&Num, Operate(b,chOpe,a));

break;

}

}

}

//返回结果 因为链表中的数据域是char型 , 所需要进行char和int之间的转换('0'的对应的ASCII码是48 所以应该减去48)

return GetTop(&Num) - 48;

}

注释应该算是比较清晰了 ,  算法就不赘述了

以下是完整代码:

/*

四则运算(栈的应用)

*/

#include

#include

#include

typedef struct stacknode

{

char data;

struct stacknode *next;

}StackNode, *StackNodePtr;

typedef struct

{

StackNodePtr top;

int count;

}LinkStack;

/*初始化*/

void InitStack(LinkStack *S)

{

S->top = NULL;

S->count = 0;

}

/*获取栈顶元素*/

char GetTop(LinkStack *S)

{

if(!(S->top))

return '\0';

return S->top->data;

}

/*压栈*/

void Push(LinkStack *S, char e)

{

StackNodePtr p = (StackNodePtr)malloc(sizeof(StackNode));

p->next = S->top;

p->data = e;

S->top = p;

S->count++;

}

/*出栈*/

char Pop(LinkStack *S)

{

StackNodePtr p;

char data;

if(S->top == NULL)

{

return '\0';

}

p = S->top;

S->top = p->next;

S->count--;

data = p->data;

free(p);

return data;

}

/*选择行列标*/

int ChooseIJ(char index)

{

int i;

switch(index)

{

case '+':

i=0;

break;

case '-':

i=1;

break;

case '*':

i=2;

break;

case '/':

i=3;

break;

case '(':

i=4;

break;

case ')':

i=5;

break;

case '#':

i=6;

}

return i;

}

/*判断运算符优先级*/

char Judge(char top, char ch)

{

static char order[][7]={

// + - * / ( ) #

/* + */'>','>','','>',

/* - */'>','>','','>',

/* * */'>','>','>','>','','>',

/* / */'>','>','>','>','','>',

/* ( */'

/* ) */'>','>','>','>',' ','>','>',

/* # */'

};

int i,j;

i = ChooseIJ(top);

j = ChooseIJ(ch);

return order[i][j];

}

/*运算:O1 运算符 O2*/

int Operate(int O1, char op, int O2)

{

int result;

O1 -= 48;

O2 -= 48;

switch(op)

{

case '+':

result = O1 + O2;

break;

case '-':

result = O1 - O2;

break;

case '*':

result = O1 * O2;

break;

case '/':

result = O1 / O2;

break;

}

//输出运算过程

printf("%d %c %d = %d\n", O1, op, O2, result);

return result+48;

}

/*算术表达式求值算法*/

int CountExpression()

{

LinkStack Ope, Num;//操作符栈和操作数栈

char a,b,c,chOpe;

InitStack(&Ope);//初始化符号栈

Push(&Ope, '#');//因为输入中包含# 于是先压一个# 用于判断是否结束

InitStack(&Num);//初始化操作数栈

c = getchar();

//读取遇到#或操作符栈顶为# 就表示结束运算

while(c != '#' || GetTop(&Ope) != '#')

{

//如果是操作数(小于10的一位数) 就压入操作数栈

if(c>= '0' && c<= '9')

{

Push(&Num, c);

c = getchar();

}

//压入操作符栈

else

{

switch(Judge(GetTop(&Ope), c))

{

case '

Push(&Ope, c);

c = getchar();

break;

case '='://当遇到右括号时 就出括号, 并接收下一个字符

Pop(&Ope);

c = getchar();

break;

case '>'://栈顶的操作符优先级高 , 说明需要运算 , 并将计算结果压入操作数栈中

chOpe = Pop(&Ope);

a = Pop(&Num);

b = Pop(&Num);

Push(&Num, Operate(b,chOpe,a));

break;

}

}

}

//返回结果 因为链表中的数据域是char型 , 所需要进行char和int之间的转换('0'的对应的ASCII码是48 所以应该减去48)

return GetTop(&Num) - 48;

}

/*测试*/

int main()

{

printf("%d\n", CountExpression());

return 0;

}

运行结果:

如果大家仔细观察  运行结果  , 可以发现:

每一步的运算结果都是小于10的一位整数

没错 , 这个也是算法的局限性    主要是处理数据上的局限性 , 我想了一下 , 要打破这个局限性 , 貌似有点儿难度 ,  等以后灵感来了再来吧……

也欢迎各位高手相互讨论算法

c语言利用栈实现四则运算(包括括号小数),DataStructure_1用栈实现四则运算(c语言)...相关推荐

  1. 括号匹配问题(栈应用)C++

    ()[ ] { }三种括号进行匹配. 左括号入栈,碰到右括号,就出栈一个元素,如果栈为空或者出栈的元素与该括号不匹配,则不合法,直接标记退出. #include<iostream> #in ...

  2. c语言上期中考试试卷答案,2007~2008学年度上学期C语言程序设计期中试卷及答案...

    2007-2008学年度上学期C 语言程序设计期中试卷 一.填空题(本大题30空,每空1分共30分) 1.C 语言中的基本数据类型包括 . . 三种. 2.C 语言中的逻辑运算符有 . . 三种. 3 ...

  3. 利用栈进行程序的括号匹配

    利用栈进行程序的括号匹配 程序代码: /** fanchen.cpp : 定义控制台应用程序的入口点.**/#include "stdafx.h" #include <ios ...

  4. C语言详解括号匹配问题(栈的应用 )

    文章目录 问题概述 算法思路 不匹配的情况 实现流程图 C语言代码 结果测试 问题概述 检测括号是否成对出现 最后出现的左括号最先匹配(LIFO),和栈的后进先出异曲同工 每出现一个右括号,就抵消(出 ...

  5. c语言中缀表达式求值_数据结构考研笔记之栈与队列(四)栈与队列应用括号匹配、中缀表达式转前缀后缀问题...

    文字:独木 排版:独木 图片:独木 栈与队列 1.括号匹配问题 栈 例题1 例题2-----不匹配例题1 例题3-----不匹配例题2 2. 表达式求值问题 例题 1.中缀表达式转前缀表达式 2.中缀 ...

  6. c语言中缀表达式求值_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)

    第三章:栈和队列 下面讲解栈的应用主要内容有:栈的应用.括号匹配.中 后 前 缀表达式转换 1.栈的应用 1.1括号匹配 我们在数学运算中 [(A+b)*c] - (E-F) 往往都会有[ ] 和 ( ...

  7. C语言利用栈计算算式(表达式)

    本文介绍如何通过栈来实现计算算式. 首先 我们要通过多个栈对算式进行操作和计算得出答案,在计算前,我们需要先明确整个计算的流程: 获取用户输入并保存 判断算式是否合理 一些预处理-(例如:删除空格,大 ...

  8. 刁肥宅手笔:纯C语言利用链栈实现从后缀表达式Array中顺序输入表达式并求值

    链栈+后缀表达式求值算法,借用我自己上次C语言写的链栈,详细实现代码如下: 头文件C_Stack.h: /*C_Stack.h*/#ifndef C_STACK_H_INCLUDED #define ...

  9. C语言利用前缀表达式实现复杂科学计算器

    用C语言实现的科学计算器,支持2种常量,10种基本函数,Ans寄存器.相对来说拓展性应该是不错的,思路是首先化简复杂名称的函数名和常量名,然后把表达式转换成前缀表达式,再直接处理前缀表达式即可.因此对 ...

最新文章

  1. Rails插件:CanCan权限验证插件学习总结
  2. redis 的使用 (sort set排序集合类型操作)
  3. python中对文件、文件夹(文件操作函数)的操作
  4. 数据结构与算法 / 贪心算法
  5. TK:vtkCellTreeLocator用法实战
  6. c语言图片见水印,[求助]C语言 bmp文件加上水印
  7. 哪里可以培训计算机运维,临武县运维工程师培训班_郴州科泰计算机学校
  8. Android add external jar
  9. 知识技能归档--CA-PKI体系-20210324
  10. 【rabbitmq安装教程】centos7下安装rabbitMQ
  11. 线程 pthread_create Linux函数 线程创建
  12. java spark 教程_Spark基础教程——向Spark传递函数(Java篇)
  13. 我体验了禾多科技的自动驾驶汽车,离量产不远了!
  14. 【企业开源】小米开源:站在巨人肩膀上的创新
  15. 嵌入式成长轨迹33 【嵌入式学习阶段】【ARM环境调试】【在虚拟机下Ubuntu建立NFS网络文件系统】...
  16. LeanCloud 将加入心动/TapTap
  17. 等我装完B 我再收拾你 Wating me to fuck you
  18. 大数据之电信项目架构
  19. 瓷砖铺贴方法_15种瓷砖铺贴方式介绍 总有一种适合你
  20. 洛谷 P3389 【模板】高斯消元法 × 洛谷 P2455 [SDOI2006]线性方程组

热门文章

  1. SYD8811 ADC注意点
  2. 软件测试中需要使用的工具大全
  3. 用 AI 进行数字识别吧,不仅防止欺诈并可以提高投资回报率
  4. 高分辨率屏幕下字体异常小、图标模糊问题处理
  5. Linux性能监控之CPU
  6. MySQL之初始化配置
  7. 笔记本外接显示器分辨率调节
  8. 聚焦安全,德施曼极致的工匠精神
  9. OpenCV在IMX6上的移植
  10. Win8 输入法切换 (Ctrl + space)个人解决方案