abcde-怎样用c实现链栈的算术表达式运算,不得使用stl模板

问题描述

怎样用c实现链栈的算术表达式运算,不得使用stl模板
按照严蔚敏版的书上的算法,用c语言链栈实现,不让使用stl模板,有没有原代码

解决方案

#include""stdio.h""

#include""stdlib.h""

#include""string.h""

#include""math.h""

#define true 1

#define false 0

#define OPSETSIZE 8

typedef int Status;

unsigned char Prior[8][8] =

{ // 运算符优先级表

// '+' '-' '*' '/' '(' ')' '#' '^'

/*'+'*/'>''>''<''<''<''>''>''<'

/*'-'*/'>''>''<''<''<''>''>''<'

/*'*'*/'>''>''>''>''<''>''>''<'

/*'/'*/'>''>''>''>''<''>''>''<'

/*'('*/'<''<''<''<''<''='' ''<'

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

/*'#'*/'<''<''<''<''<'' ''=''<'

/*'^'*/'>''>''>''>''<''>''>''>'

};

typedef struct StackChar

{

char c;

struct StackChar *next;

}SC; //StackChar类型的结点SC

typedef struct StackFloat

{

float f;

struct StackFloat *next;

}SF; //StackFloat类型的结点SF

SC SC_Push(SC *schar c) //SC类型的指针Push,返回p

{

SC *p=(SC)malloc(sizeof(SC));

p->c=c;

p->next=s;

return p;

}

SF SF_Push(SF *sfloat f) //SF类型的指针Push,返回p

{

SF *p=(SF)malloc(sizeof(SF));

p->f=f;

p->next=s;

return p;

}

SC *SC_Pop(SC *s) //SC类型的指针Pop

{

SC *q=s;

s=s->next;

free(q);

return s;

}

SF *SF_Pop(SF *s) //SF类型的指针Pop

{

SF *q=s;

s=s->next;

free(q);

return s;

}

float Operate(float aunsigned char theta float b) //计算函数Operate

{

switch(theta)

{

case '+': return a+b;

case '-': return a-b;

case '*': return a*b;

case '/': return a/b;

case '^': return powf(ab);

default : return 0;

}

}

char OPSET[OPSETSIZE]={'+''-''*''/''('')''#''^'};

Status In(char Testchar *TestOp)

{

int Find=false;

for (int i=0; i< OPSETSIZE; i++)

{

if(Test == TestOp[i])

Find= true;

}

return Find;

}

Status ReturnOpOrd(char opchar *TestOp)

{

for(int i=0; i< OPSETSIZE; i++)

{

if (op == TestOp[i])

return i;

}

}

char precede(char Aop char Bop)

{

return Prior[ReturnOpOrd(AopOPSET)][ReturnOpOrd(BopOPSET)];

}

float EvaluateExpression(char* MyExpression)

{

// 算术表达式求值的算符优先算法

// 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合

SC *OPTR=NULL; // 运算符栈,字符元素

SF *OPND=NULL; // 运算数栈,实数元素

char TempData[20];

float Dataab;

char theta*cDr[]={'#'''};

OPTR=SC_Push(OPTR'#');

c=strcat(MyExpressionDr);

strcpy(TempData"");//字符串拷贝函数

while (*c!= '#' || OPTR->c!='#')

{

if (!In(*c OPSET))

{

Dr[0]=*c;

strcat(TempDataDr); //字符串连接函数

c++;

if (In(*c OPSET))

{

Data=atof(TempData); //字符串转换函数(double)

OPND=SF_Push(OPND Data);

strcpy(TempData"");

}

}

else // 不是运算符则进栈

{

switch (precede(OPTR->c *c))

{

case '<': // 栈顶元素优先级低

OPTR=SC_Push(OPTR *c);

c++;

break;

case '=': // 脱括号并接收下一字符

OPTR=SC_Pop(OPTR);

c++;

break;

case '>': // 退栈并将运算结果入栈

theta=OPTR->c;OPTR=SC_Pop(OPTR);

b=OPND->f;OPND=SF_Pop(OPND);

a=OPND->f;OPND=SF_Pop(OPND);

OPND=SF_Push(OPND Operate(a theta b));

break;

} //switch

}

} //while

return OPND->f;

} //EvaluateExpression

int main(void)

{

char s[128];

puts(""请输入表达式:"");

gets(s);

puts(""该表达式的值为:"");

printf(""%s=%g
""sEvaluateExpression(s));

return 0;

}

解决方案二:
利用栈实现简单算术表达式求值
算术表达式求值(顺序栈实现)

解决方案三:
http://blog.csdn.net/yanggangfly/article/details/8895684

时间: 2024-11-08 18:27:02

abcde-怎样用c实现链栈的算术表达式运算,不得使用stl模板的相关文章

qdskd-怎样用c实现链栈的算术表达式运算,不得使用stl模板

问题描述 怎样用c实现链栈的算术表达式运算,不得使用stl模板 按照严蔚敏版的书上的算法,用c语言链栈实现,不让使用stl模板,有没有原代码 解决方案 http://download.csdn.net/detail/immoyu/3431468 解决方案二: 利用栈实现简单算术表达式求值算术表达式求值(顺序栈实现)

malloc-数据结构用栈实现算术表达式的求值运算

问题描述 数据结构用栈实现算术表达式的求值运算 小白一枚,最近用栈实现算术表达式的求值运算结果出现好多问题,单独的加减乘除运算都能够实现,但一旦加上括号运算就停在那命令窗口也不能输入信息,跪求大神指点原因 附上代码和截图: #include #include #include #define STACK_INIT_SIZE 100 //存储空间初始分配量; #define S 10 //存储空间分配增量; #define OK 1 #define ERROR 0 typedef int Elem

链栈的实现示例

栈的链式实现例子 #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED #include "ds.h" //for Status,OK ... #ifndef ElemType #define ElemType int /* 数据元素类型默认为 int */ #define ELEMTYPE_TAG #endif /////////////////////////////////////////////////////////// //链栈

求高手相助,java数据结构中使用链栈编程实现两个大数相减

问题描述 求高手相助,java数据结构中使用链栈编程实现两个大数相减 求高手相助,急交作业的,java数据结构中使用链栈编程实现两个大数相减,感激不尽. 解决方案 今天已经23号了....已经晚了我就不给你做了..原理思路你这里都有了..节哀

c语言-关于链栈头指针的问题

问题描述 关于链栈头指针的问题 以上为链栈程序(无错),但为什么不能将直接用struct node 定义一个top指针,而要用一个结构体里面放top指针.如果直接用struct node 定义一个top指针那么入栈部分将出错,为何?或者说这两者区别在哪? 解决方案 ** 楼主,注意看你设计的数据结构,如果你用struct node *top 直接指向头的话,那么这个top包含2个内容, 1: int data ; 2: struct node *next ; 这样的话在你操作的时候,不是很方便,

c++ 链栈 出错-c++链栈问题,求大神,大一无力啊

问题描述 c++链栈问题,求大神,大一无力啊 程序运行的时候出错,自己弄了好久不知道怎么办,百度了也不行#include #include using namespace std; enum error_code{success,underflow,overflow}; //定义枚举 char opr[]={'+','-','*','/','(',')','#'}; struct node{ char data0; int data1; node *next; }; int comp[7][7]

c语言-参照网上,自己改用链栈写了个表达式求值的代码出现的问题

问题描述 参照网上,自己改用链栈写了个表达式求值的代码出现的问题 这个代码可以编译运行,但是输入值进行计算的时候就会停止工作 附上代码: 附上代码求指导: #include #include typedef struct rope { char date; struct rope next; } node,*pnode; typedef struct rope2 { char date; struct rope2 *next; } nodes,*pnodes; typedef struct a

数据结构之自建算法库——链栈

本文针对数据结构基础系列网络课程(3):栈和队列中第4课时栈的链式存储结构及其基本运算实现. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 链栈算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:listack.h,包含定义链栈数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef LISTACK_H_INCLUDED #define LISTACK_H_INCLUDED typedef char ElemType; typede

java-关于Java链栈判断回文出现的空指针问题求解答-0-

问题描述 关于Java链栈判断回文出现的空指针问题求解答-0- public boolean isPalindSeq(String str)throws Exception{ if (str == null) { return false; } LinkStack s1=new LinkStack(); int i=0; do{ if(Character.isWhitespace((str.charAt(i)))){ i++; continue; } else{ s1.push(str.char