这个博客介绍的公式的评价用c语言实现,只使用了c中的引用。
虽然是数据结构教科书上的例题,看起来很简单,但在实现上存在很多问题。
为此,需要构建两个包含运算符OPTR和数字OPND的堆栈。
但是,数字和运算符都被定义为字符类型堆栈吗?
发生了问题。 运算结果或中间结果为负时,无法保存。 而且只能运算0~9之间的数字的结果也只有0~9之间。
它是运算符堆栈为字符堆栈,数值堆栈为数值型堆栈,存储时将公式中的字符转换为数值进行存储。
但是,如果在c中的堆栈中没有定义堆栈,而是用c语言实现,那么用这种方法实现似乎也没那么简单,代码很多。 两个堆栈的元素类型不同,操作繁琐。
我该怎么办,我认为可以用char类型的ASCII代码中的数字表示数字,两个堆栈都被定义为字符堆栈。
存储数值时,从导入的字符类型变量的值中减去0的ASCII代码值c - '0'进行堆栈。
但是,这样做也有缺点,c语言中char类型应该只有8位,是对该方法实现的表达式的评估,其结果和中间值的可能范围[-128,127 ]。
我们主要学习堆栈的实现和应用,其实这个问题已经足够了。
代码的实现附在下面。
#包含
#包含
#定义元素类型char
#define STACKINCEMENT 10
#define STACK_INIT_SIZE 50
#define Status int
#定义ok 1
#define ERROR 0
#定义溢出- 2
类型定义结构{
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;
稳定堆栈(sqstacks ) {
S.top=S.base=(ElemType * ) malloc(sizeof ) elemtype ) * STACK_INIT_SIZE );
if (! S.top )
溢出;
s .堆叠大小=堆叠_ init _ size;
返回确定;
}//init堆栈
状态推送(sqstacks,ElemType e ) {
if(s.top-s.base==s.stacksize ) {
s.base=(elemtype* ) realloc ) s.base,sizeof(elemtype ) *
(S.stacksize STACKINCEMENT )
if (! S.base ) exit (溢出);
S.top=S.base S.stacksize;
S.stacksize =STACKINCEMENT;
}
*S.top =e
返回确定;
}//Push
statuspop(sqstacks,ElemType e ) {
if(s.base==s.top )返回错误;
e=*--S.top;
返回确定;
}//Pop
elemtypegettop(sqstacks ) {
if(s.base==s.top )返回错误;
return *--S.top;
}//GetTop
Satusin(elemtypec ) {
if (c==' '|c=='-'|c==' * '|| c=='/'|| c=' # '|c='|||| c=|| )
返回;
else
返回;
}//In
charprecede(elemtypea,ElemType b ) {
if(a==''|a=='-' ) {
if (b==' '|b=='-'|b==' '|b='||b===' ] ' #|| b==' ) '|| b=' '
返回' ';
else return '
}
if(a=='*'|a=='/' ) {
if(b=='(||b=='[ )
return '
else return ' ';
}
if(a==() ) ) )。
if(b==' ) )
返回'=';
p>else return '
}
if(a=='['){
if(b==']')
return '=';
else return '
}
if(a=='#'){
if(b=='#')
return '=';
else return '
}
}//Precede
ElemType Operate(ElemType a, ElemType x, ElemType b){
switch (x){
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
}
}//Operator
ElemType EvaluateExpression(){
SqStack OPTR, OPND;
InitStack(OPTR); //操作符
Push(OPTR, '#');
InitStack(OPND); //操作数
char x, c[];
gets(c);
int i=;
while(c[i] != '#' || GetTop(OPTR)!='#'){
if(!In(c[i])) {
if(i> && (c[i-]>''&& c[i-]<='')){
Pop(OPND, x);
Push(OPND, *x + c[i] - '');
}
else Push(OPND, c[i] - '');
i++;
}
else
switch(Precede(GetTop(OPTR), c[i])){
case '
Push(OPTR, c[i]);
i++;
break;
case '=':
Pop(OPTR, x);
i++;
break;
case '>':
Pop(OPTR, x);
ElemType a, b;
Pop(OPND, b); Pop(OPND, a);
Push(OPND, Operate(a, x, b));
break;
}
}
return GetTop(OPND);
}//EvaluateExpression
int main(){
SqStack S;
InitStack(S);
printf("%d",EvaluateExpression());
return ;
}
数据结构课程设计四则运算表达式求值(C语言版)
本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项: 1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...
数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
C++表达式求值(利用数据结构栈)
唉,刚刚用C++又又一次写了一个较完好的表达式求值程序,最后精简后程序还不到100行.这不经让我 想到了大一上学期刚学c语言时自己费了好大的劲,写了几百行并且功能还不是非常齐全(当时还不能计算有括号的 ...
利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
【算法】E.W.Dijkstra算术表达式求值
算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3 ...
C/C++ 语言中的表达式求值(原文作者:标致的小天鹅)
经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...
Dijkstra的双栈算术表达式求值算法
这次来复习一下Dijkstra的双栈算术表达式求值算法,其实这就是一个计算器的实现,但是这里用到了不一样的算法,同时复习了栈. 主体思想就是将每次输入的字符和数字分别存储在两个栈中.每遇到一个单次结束 ...
算法手记(2)Dijkstra双栈算术表达式求值算法
这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了 ...
[algorithm] Dijkstra双栈算法表达式求值算法
一.原理 Dijkstra所做的一个算法,双栈求值,用两个栈(一个保存运算符,一个用于保存操作数), 表达式由括号,运算符和操作数组成. (1).将操作数压入操作数栈 (2).将运算符压入运算符栈: ...
随机推荐
还是this的问题
var name = "The Window"; var object = { name : "My Object", getNameFunc ...
【原创】Android开发之ADB及ADB SHELl命令的应用
adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具.adb的工作方式比 ...
Django中静态文件引用优化
静态文件引用优化 在html文件中是用django的静态文件路径时,一般会这么写: