• 大小: 128KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-12
  • 语言: 其他
  • 标签: 数据结构  

资源简介

可以计算包含加减乘除的算术表达式,还可以用来计算带小数的表达式,表达式输入错误时会提示!

资源截图

代码片段和文件信息

#include
#include
#include
#define Max 30

typedef struct node1  /*定义符号栈*/
{
char data[Max];
int  top;
}SignSeqStack*SignPSeqStack;

typedef struct node2  /*定义数字栈*/
{
double data[Max];
int  top;
}NoSeqStack*NoPSeqStack;

SignPSeqStack SInit()   /*符号栈的初始化*/
{
    SignPSeqStack s;
    s=(SignPSeqStack)malloc(sizeof(SignSeqStack));
    if(s)
        s->top=-1;
    return s;


NoPSeqStack NInit()   /*数字栈的初始化*/
{
    NoPSeqStack s;
    s=(NoPSeqStack)malloc(sizeof(NoSeqStack));
    if(s)
        s->top=-1;
    return s;


void SPush(SignPSeqStack schar x)  /*符号入栈函数*/
{
if(s->top==Max-1)
{
printf(“表达式过长,不能计算!“);
return;
}
else
{
s->top++;
s->data[s->top]=x;
}
}

void NPush(NoPSeqStack sdouble x)  /*数字入栈函数*/
{
if(s->top==Max-1)
{
printf(“表达式过长,不能计算!“);
return;
}
else
{
s->top++;
s->data[s->top]=x;
}
}

void SPop(SignPSeqStack Schar *x)  /*符号出栈函数*/
{
if(S->top==-1)
       return;
else
{
*x=S->data[S->top];
S->top--;
}
}

void NPop(NoPSeqStack Sdouble *x)  /*数字出栈函数*/
{
if(S->top==-1)
       return;
else
{
*x=S->data[S->top];
S->top--;
}
}

char Priority(char s1char s2)   /*判断运算符优先级*/
{
int irowcol;
static char CH[7]={‘+‘‘-‘‘*‘‘/‘‘(‘‘)‘‘#‘}  /*运算符*/
R[7][7]={{‘>‘‘>‘‘<‘‘<‘‘<‘‘>‘‘>‘}       /*运算符优先关系*/
             {‘>‘‘>‘‘<‘‘<‘‘<‘‘>‘‘>‘}
             {‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘>‘}
             {‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘>‘}
             {‘<‘‘<‘‘<‘‘<‘‘<‘‘=‘‘/‘}
             {‘>‘‘>‘‘>‘‘>‘‘/‘‘>‘‘>‘}
             {‘<‘‘<‘‘<‘‘<‘‘<‘‘<‘‘<‘}};
    for(i=0;i<7;i++)
        if(CH[i]==s1)
{
row=i;
break;
}
for(i=0;i<7;i++)
    if(CH[i]==s2)
{
col=i;
break;
}
if(col<7&&row<7)
return (R[row][col]);
else
return ‘/‘;
}

void Symbol(char *chint *mSignPSeqStack SNoPSeqStack N);
 
void Digital(char *chint *mNoPSeqStack NSignPSeqStack S) /*数字处理函数*/
{
int flag=0;
int a=0;   /*a用于存放数字的整数部分*/
double b=0.0e=0.1; /*b用于存放数字的小数部分*/
if(ch[*m]==‘-‘)
{
if(!(*m==0||ch[*m-1]==‘(‘))   /*判断“-”是负号还是减号*/
{
Symbol(chmSN);  /*是减号,处理*/
return;
}
else 
{
flag=1;    /*flag=1表示有负号*/
(*m)++;
}
}
for(;ch[*m]>=‘0‘&&ch[*m]<=‘9‘;(*m)++)  /*处理整数部分*/
{
a*=10;
a+=ch[*m]-‘0‘; 
}
if(ch[*m]==‘.‘)    /*判断有没有小数*/
for(++(*m);ch[*m]>=‘0‘&&ch[*m]<=‘9‘;(*m)++)  /*处理小数部分*/
{
double d;
d=double(ch[*m]-‘0‘);
d*=e;
e*=0.1;
b+=d;
}
(*m)--;
if(flag==1)   /*是负数,将负数入栈*/
    NPush(N0.0-(a+b));
else
NPush(Na+b);
}

void Symbol(char *chint *mSignPSeqStack SNoPSeqStack N)  /*符号处理函数*/
{
double abc;
int i=*m;
char xy;
y=Priority(S->data[S->top]ch[i]);
if(y==‘/‘) /*处理符号*/
{
printf(“你输入的表达式不合法!将导致计算错误!“);
return ;
}
else if(y==‘<‘)
{
SPush(Sch[i]);
return;
}
else if(y==‘=‘)
{
SPop(S&x);
    

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      50176  2008-03-25 23:21  表达式求值\表达式求值.ncb

     文件      53248  2008-03-25 23:20  表达式求值\Debug\vc60.pdb

     文件     208986  2008-03-25 23:21  表达式求值\Debug\表达式求值.exe

     文件     467968  2008-03-25 23:21  表达式求值\Debug\表达式求值.pdb

     文件      12794  2008-03-25 23:20  表达式求值\Debug\表达式求值.obj

     文件        254  2008-03-25 23:21  表达式求值\表达式求值.plg

     文件       4334  2008-01-11 14:48  表达式求值\表达式求值.cpp

     文件       3451  2008-03-25 23:20  表达式求值\表达式求值.dsp

     文件      48640  2008-03-25 23:21  表达式求值\表达式求值.opt

     文件        528  2008-03-25 23:21  表达式求值\表达式求值.dsw

     目录          0  2008-01-10 19:42  表达式求值\Debug

     目录          0  2008-01-10 19:42  表达式求值

----------- ---------  ---------- -----  ----

               850379                    12


评论

共有 条评论