c语言利用栈实现四则运算(包括括号小数),DataStructure_1用栈实现四则运算(c语言)...
有一句计算机界中的至理名言:
程序=数据结构+算法
可见数据结构是多么地重要啊......呵呵
今天开始复习了一下数据结构 , 解决了以前的一个问题:
用栈这个数据结构实现四则运算
算法思想是借鉴了<>(清华大学出版社 严蔚敏)中的一些思想 , 最原始的算法就是波兰一位逻辑学家的逆波兰表示法
也就是讲中缀表达式转为后缀表达式的算法 , 感觉很强大 , 呵呵......
好了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语言)...相关推荐
- 括号匹配问题(栈应用)C++
()[ ] { }三种括号进行匹配. 左括号入栈,碰到右括号,就出栈一个元素,如果栈为空或者出栈的元素与该括号不匹配,则不合法,直接标记退出. #include<iostream> #in ...
- c语言上期中考试试卷答案,2007~2008学年度上学期C语言程序设计期中试卷及答案...
2007-2008学年度上学期C 语言程序设计期中试卷 一.填空题(本大题30空,每空1分共30分) 1.C 语言中的基本数据类型包括 . . 三种. 2.C 语言中的逻辑运算符有 . . 三种. 3 ...
- 利用栈进行程序的括号匹配
利用栈进行程序的括号匹配 程序代码: /** fanchen.cpp : 定义控制台应用程序的入口点.**/#include "stdafx.h" #include <ios ...
- C语言详解括号匹配问题(栈的应用 )
文章目录 问题概述 算法思路 不匹配的情况 实现流程图 C语言代码 结果测试 问题概述 检测括号是否成对出现 最后出现的左括号最先匹配(LIFO),和栈的后进先出异曲同工 每出现一个右括号,就抵消(出 ...
- c语言中缀表达式求值_数据结构考研笔记之栈与队列(四)栈与队列应用括号匹配、中缀表达式转前缀后缀问题...
文字:独木 排版:独木 图片:独木 栈与队列 1.括号匹配问题 栈 例题1 例题2-----不匹配例题1 例题3-----不匹配例题2 2. 表达式求值问题 例题 1.中缀表达式转前缀表达式 2.中缀 ...
- c语言中缀表达式求值_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)
第三章:栈和队列 下面讲解栈的应用主要内容有:栈的应用.括号匹配.中 后 前 缀表达式转换 1.栈的应用 1.1括号匹配 我们在数学运算中 [(A+b)*c] - (E-F) 往往都会有[ ] 和 ( ...
- C语言利用栈计算算式(表达式)
本文介绍如何通过栈来实现计算算式. 首先 我们要通过多个栈对算式进行操作和计算得出答案,在计算前,我们需要先明确整个计算的流程: 获取用户输入并保存 判断算式是否合理 一些预处理-(例如:删除空格,大 ...
- 刁肥宅手笔:纯C语言利用链栈实现从后缀表达式Array中顺序输入表达式并求值
链栈+后缀表达式求值算法,借用我自己上次C语言写的链栈,详细实现代码如下: 头文件C_Stack.h: /*C_Stack.h*/#ifndef C_STACK_H_INCLUDED #define ...
- C语言利用前缀表达式实现复杂科学计算器
用C语言实现的科学计算器,支持2种常量,10种基本函数,Ans寄存器.相对来说拓展性应该是不错的,思路是首先化简复杂名称的函数名和常量名,然后把表达式转换成前缀表达式,再直接处理前缀表达式即可.因此对 ...
最新文章
- Rails插件:CanCan权限验证插件学习总结
- redis 的使用 (sort set排序集合类型操作)
- python中对文件、文件夹(文件操作函数)的操作
- 数据结构与算法 / 贪心算法
- TK:vtkCellTreeLocator用法实战
- c语言图片见水印,[求助]C语言 bmp文件加上水印
- 哪里可以培训计算机运维,临武县运维工程师培训班_郴州科泰计算机学校
- Android add external jar
- 知识技能归档--CA-PKI体系-20210324
- 【rabbitmq安装教程】centos7下安装rabbitMQ
- 线程 pthread_create Linux函数 线程创建
- java spark 教程_Spark基础教程——向Spark传递函数(Java篇)
- 我体验了禾多科技的自动驾驶汽车,离量产不远了!
- 【企业开源】小米开源:站在巨人肩膀上的创新
- 嵌入式成长轨迹33 【嵌入式学习阶段】【ARM环境调试】【在虚拟机下Ubuntu建立NFS网络文件系统】...
- LeanCloud 将加入心动/TapTap
- 等我装完B 我再收拾你 Wating me to fuck you
- 大数据之电信项目架构
- 瓷砖铺贴方法_15种瓷砖铺贴方式介绍 总有一种适合你
- 洛谷 P3389 【模板】高斯消元法 × 洛谷 P2455 [SDOI2006]线性方程组