链表计算器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//基本思路:
/*
一个小小的计算器
通过链表指针指向下一个链表的功能,组成一个运算列表,从而实现将已经计算了的值去掉,然后指向未计算的地方, 1+2*3/5 每个数值跟符号存在一个结构中
先乘除,2*3 的结果存入2的单元中,然后2的指针指向/(除号)
所以在链表中为1+6/5
Prev 代表当前链表单元的上一个链表单元,CUR 代表当前的链表,LAST 代表下一个链表检查当前链表单元CUR是否是*/法,如果是就计算,存储在Prev 的值中,CUR 跳过已经计算的链表单元,指向下一链表单元,修改PREV的指针指向CUR,LAST等于CUR指向的下一个单元
乘除法后,再计算加减法ADDSUB
优先级:
1.先括号
2.乘除
3.加减
*/
//VC程序:
#include "module.h"
//填充数组
List iList(List *nadr,double num,BYTE type)
{
List ls1;
ls1.nextadr = nadr;
ls1.num = num;
ls1.type = type;
return ls1;
};
//使用表达式10+6*3/2-5*6初始化数组
void init() // 10+6*3/2-5*6
{
ps[0] = iList(&ps[1],10,_num);
ps[1] = iList(&ps[2],'+','+');
ps[2] = iList(&ps[3],6,_num);
ps[3] = iList(&ps[4],'*','*');
ps[4] = iList(&ps[5],3,_num);
ps[5] = iList(&ps[6],'/','/');
ps[6] = iList(&ps[7],2,_num);
ps[7] = iList(&ps[8],'-','-');
ps[8] = iList(&ps[9],5,_num);
ps[9] = iList(&ps[10],'*','*');
ps[10] = iList(&ps[11],6,_num);
ps[11] = iList(&ps[12],0,null);
}
//运行
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here init();
//string to list
//kuohao
MulDiv(ps); //先乘除
AddSub(ps); //后加减
long result = ps[0].num;
}
//头文件:
#define Elen 20
struct List
{
List* nextadr;
double num;
BYTE type;
};
List ps[Elen];
#define _num 1
#define null 0
//根据的值SIGN(+-*/),进行两个数的加减乘除运算
double calc(List *num1,List *num2,long sign)
{
long result=0;
if(sign == '*')
result = num1->num * num2->num;
else if(sign == '/')
result = num1->num / num2->num;
else if(sign == '+')
result = num1->num + num2->num;
else if(sign == '-')
result = num1->num - num2->num;
return result;
}
//找到表达式中所有的乘除法运算,计算(要先乘除) void MulDiv(List *start)
{
List *prev,*cur,*last;
prev = start;
cur = start->nextadr;
last = cur->nextadr;
for(int i=0;i { if(cur->type == null) break; if(cur->type == '*' | cur->type == '/') { double result = calc(prev,last,cur->type); prev->num = result; cur = last->nextadr; prev->nextadr = cur; last = cur->nextadr; continue; } prev = cur; cur = last; last = last->nextadr; } } //找到表达式中所有的加减法运算,进行运算(后加减) void AddSub(List *start) { List *prev,*cur,*last; prev = start; cur = start->nextadr; last = cur->nextadr; for(int i=0;i { if(cur->type == null) break;