用栈对算术表达式求值:3*(7-2),写出栈的操作顺序和过程

如题所述

#include "StdAfx.h"
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack_T;
typedef struct
{
float *base;
float *top;
int stacksize;
}SqStack_N;
void InitStack_T(SqStack_T *S)
{
(*S).base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!(*S).base) exit(OVERFLOW);
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
}
void InitStack_N(SqStack_N *S)
{
(*S).base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
if(!(*S).base) exit(OVERFLOW);
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
}
char GetTop_T(SqStack_T *S)
{
char e;
if((*S).top==(*S).base)
return ERROR;
e=*((*S).top-1);
return e;
}
float GetTop_N(SqStack_N *S)
{
float e;
if((*S).top==(*S).base)
return ERROR;
e=*((*S).top-1);
return e;
}
char Push_T(SqStack_T *S,char e)
{
if((*S).top-(*S).base>=(*S).stacksize)
{
(*S).base=(char*)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(char));
if(!(*S).base) exit(OVERFLOW);
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;
}
*((*S).top)++=e;
return OK;
}
float Push_N(SqStack_N *S,float e)
{
if((*S).top-(*S).base>=(*S).stacksize)
{
(*S).base=(float*)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(float));
if(!(*S).base) exit(OVERFLOW);
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;
}
*((*S).top)++=e;
return OK;
}
char Pop_T(SqStack_T *S)
{
char e;
if((*S).top==(*S).base)
return ERROR;
e=*(--(*S).top);
return e;
}
float Pop_N(SqStack_N *S)
{
float e;
if((*S).top==(*S).base)
return ERROR;
e=*(--(*S).top);
return e;
}
char m[10]="+-*/()#";
char n[10][10]={">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<= ",">>>> >>","<<<<< ="};
char Precede(char a,char b)
{
int i=0,j=0;
while(m[i]!=a)
i++;
while(m[j]!=b)
j++;
return(n[i][j]);
}
float Operate(float a,char theta,float b)
{
float r;
switch(theta)
{
case'+':
r=a+b;
break;
case'-':
r=a-b;
break;
case'*':
r=a*b;
break;
case'/':
if(b!=0)r=a/b;
else printf("输入错误!");
break;
}
return r;
}
void main()
{
SqStack_T OPTR;
SqStack_N OPND;
float a,b,i;
char theta,c,x;
InitStack_T(&OPTR);
Push_T(&OPTR,'#');
InitStack_N(&OPND);
printf("请输入表达式并以'#'结尾:\n");
c=getchar();
if(c==35||(c>=40&&c<=43)||c==45||(c>=47&&c<=57))
{
while(c!='#'||GetTop_T(&OPTR)!='#')
{
if(c>=48&&c<=57)
{
i=(float)c-48;
Push_N(&OPND,i);
c=getchar();
}
else
{
switch(Precede(GetTop_T(&OPTR),c))
{
case'<': //栈顶元素优质权低
Push_T(&OPTR,c);
c=getchar();
break;
case'=': //脱括号并接受下一个字符
x=Pop_T(&OPTR);
c=getchar();
break;
case'>': //退栈并将运算结果入栈
theta=Pop_T(&OPTR);
b=Pop_N(&OPND);
a=Pop_N(&OPND);
Push_N(&OPND,Operate(a,theta,b));
break;
}
}
}
printf("结果是%f\n",GetTop_N(&OPND));
c=getchar();
c=getchar();
}
else
printf("输入错误!\n");
}

这个不止3*(7-2)了啦~~~
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-03-09
定义:运算符栈s,操作数栈c
读3+,+压入栈s,3压入栈c;
读5*7,*压入栈s,5压入栈c,7压入栈c;
读-,*运算顺序高于+-,取栈c中的7和5,取栈s中的*,计算5*7=35,35压入栈c,-压入栈s;
读4,压入栈c,读取完;
取栈c中的4和35,取栈s中的-,计算35-4=31,取栈c中的3,取栈s中的+,计算3+31=34
第2个回答  2011-10-29
我写过,如果是大整数,比如说输入的数有几百位,那个代码我写了500多近600行!你才15分!!!!
老大,别说别人看见不会给你写,我写好的我都懒得去题堆里给你找代码!
呵呵.....

太大发布过去,给我个你的邮箱!我给你发邮箱里!

(二)用顺序栈实现算术后缀表达式求值
int st[L_size],top=-1; \/\/定义一个顺序栈,top为栈顶指针 int d; \/\/定义用来字符串转换整数的变量d char ch; printf("请输入规范的后缀表达式(操作数、运算符之间使用空格间隔开,eg:15 60 42 2 \/ - 3 * +):\\n"); \/\/输入范例 while((ch=getchar())!='\\n') \/\/开始输入字符并赋给ch { ...

谁能用C语言编个完整的程序求表达式的值,例如3*(7-2)。很急...
case 2: i = 1; break;case 3:case 4: i = 2; break;

数据结构:利用栈来实现算术表达式求值的算法。
include <string.h> define error 0 define ok 1 define overflow -1 define STACK_INIT_SIZE 100 define STACKINCREMENT 10 define OPSETSIZE 7 char OPSET[OPSETSIZE]={'+','-','*','\/','(',')','#'};unsigned char Prior[7][7] = { \/\/ 算符间的优先关系 '...

表达式求值 栈 运算符优先级表
3 * ( 4 + 8 ) \/ 2 -5 注:给表达式设置#,标志扫描的开始和结束。提示算法:设两个栈,一个是操作数栈,用来存放操作数,如3、4、8等,另一个是运算符栈,用来存放运算符。首先将标志“#”进运算符栈的栈底。然后依次扫描,按照栈的后进先出原则进行:(1)遇到操作数,进操作数栈;(...

单共享栈
(一) 顺序栈利用一组地址连续的存贮单元依次自栈底到栈顶存放栈的数据元素. 栈底元素是最先进入的,实际上是线性表的第一个元素 数组(静态数组):空间固定 动态数组:动态申请空间(用指针表示) 表示容量; 表示数据元素个数; \/\/ 顺序栈的C表示利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附...

栈的应用举例:数制转换,表达式求值
只能够给你提供一些思路和线索。另外,关于不同数制之间的转换问题,这个倒是不难解决,可以采用通常的算法就是短除法,然后将每一次的余数采取“倒排”即可。例如:将十进制的 15 转换为二进制。2|15(1 -- 2|7(1 - 2|3(1 - 2|1(1 - 0 则十进制的 15 为二进制的:1111。

算术表达式求值 急求
}\/\/入栈函数模板 template <typename T1,typename T2> Status Pop(T1 &S,T2 &e){ if(S.top==S.base) return error;e=*--S.top;return ok;}\/\/出栈函数模板 template <typename T1,typename T2> T2 GetTop(T1 S){ if(S.top==S.base)return error;else return *(S.top-1);}\/\/...

栈的操作遵循什么原则,是先进后出,还是后进先出?
也就是说,最后一个被放入栈中的元素会是第一个被移除的元素。这种操作方式对于解决一些特定的问题非常有效,例如表达式的求值、函数调用等。这是因为栈可以很好地保持数据的顺序,从而保证操作顺序的准确性。尤其是在函数调用的场景中,当一个函数调用另一个函数时,其参数需要被保存以便后续处理。这种...

专题篇|栈与队列详解
给定pushed 和 popped 两个序列,每个序列中的值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true ;否则,返回 false 。 示例1: 输入:pushed = [1,2,3,4,5] , popped = [4,5,3,2,1] 输出:true 解释:我们可以按以下顺序执行:push(1) , push(2) ,...

ACM——表达式求值教程
然而,当优先级相同时,计算顺序很重要。例如,对于表达式 "3*(1+2*(3-4))",错误的计算顺序可能导致错误结果。为了解决这个问题,我们在压入新符号前,需要检查符号栈的优先级,确保符合正确的计算规则。随着问题复杂度提升,我们需要处理乘法和除法。这时,可以通过调整工作函数,引入一个优先级数组来...

相似回答