用栈对算术表达式求值:3*(7-2),写出栈的操作顺序和过程
发布网友
发布时间:2022-05-10 18:41
我来回答
共3个回答
热心网友
时间:2023-10-22 11:01
#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)了啦~~~
热心网友
时间:2023-10-22 11:01
定义:运算符栈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
热心网友
时间:2023-10-22 11:02
我写过,如果是大整数,比如说输入的数有几百位,那个代码我写了500多近600行!你才15分!!!!
老大,别说别人看见不会给你写,我写好的我都懒得去题堆里给你找代码!
呵呵.....
太大发布过去,给我个你的邮箱!我给你发邮箱里!