链表计算器

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档