问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

采用栈结构进行算术表达式的求解

发布网友 发布时间:2022-04-29 17:37

我来回答

1个回答

热心网友 时间:2023-10-24 13:33

能进行加减乘除、乘方运算

#define Stack_init_size 100
#define Stack_add 10
#include <iostream>
using namespace std;
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cstdio>
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack1;
typedef struct{
double *base;
double *top;
int stacksize;
}SqStack2;
void InitStack(SqStack1 &S)//初始化栈
{
S.base=(char *)malloc(Stack_init_size*sizeof(char));
if(!S.base)
exit(1);
S.top=S.base;
S.stacksize=Stack_init_size;
return;
}
void InitStack(SqStack2 &S)//初始化栈
{
S.base=(double *)malloc(Stack_init_size*sizeof(double));
if(!S.base)
exit(1);
S.top=S.base;
S.stacksize=Stack_init_size;
return;
}
void Push(SqStack1 &S,char e)//将e压入栈中
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char *)realloc(S.base,(S.stacksize+Stack_add)*sizeof(char));
if(!S.base)
exit(1);
S.stacksize+=Stack_add;
}
*S.top++=e;
return;
}
void Push(SqStack2 &S,double e)//将e压入栈中
{
if(S.top-S.base>=S.stacksize)
{
S.base=(double *)realloc(S.base,(S.stacksize+Stack_add)*sizeof(double));
if(!S.base)
exit(1);
S.top=S.base+S.stacksize;
S.stacksize+=Stack_add;
}
*S.top++=e;
return;
}
bool Pop(SqStack1 &S,char &e)//出栈
{
if(S.base==S.top)
return false;
e=*(--S.top);
return true;
}
bool Pop(SqStack2 &S,double &e)//出栈
{
if(S.base==S.top)
return false;
e=*(--S.top);
return true;
}
char GetTop(SqStack1 &S)//返回栈顶元素
{
if(S.base==S.top)
return 0;
return *(S.top-1);
}
double GetTop(SqStack2 &S)//返回栈顶元素
{
if(S.base==S.top)
return 0;
return *(S.top-1);
}
bool In(char c)//判断字符c是否是运算符
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#'||c=='^')
return true;
return false;
}
double todouble(char s[]) //将字符串转化为小数
{
double val, power;
int i=0, sign;
sign = (s[i] == '-')? -1 : 1;
if(s[i] == '+' || s[i] == '-')
i++;
for(val = 0.0; isdigit(s[i]); i++)
{
val = val * 10 + (s[i] - '0');
}
if(s[i] == '.')
i++;
for(power = 1.0; isdigit(s[i]); i++)
{
val = 10.0 * val + (s[i] - '0');
power *= 10;
}
return sign * val / power;
}
double power(double a,double b)//计算a的b次方
{
double s=1.0;
for(int i=0;i<b;i++)
s=s*a;
return s;
}
double Operate(double a,char theta,double b)
{
switch(theta)
{
case'+':return a+b;
case'-':return a-b;
case'*':return a*b;
case'/':return a/b;
case'^':return power(a,b);
default:return 0;
}
}
char Precede(char m,char n)
{
char Prior[8][8] = { // 算符间的优先关系
'>','>','<','<','<','>','>','<',
'>','>','<','<','<','>','>','<',
'>','>','>','>','<','>','>','<',
'>','>','>','>','<','>','>','<',
'<','<','<','<','<','=',' ','<',
'>','>','>','>',' ','>','>','>',
'<','<','<','<','<',' ','=','<',
'>','>','>','>','<','>','>','>'
};
char ch[8]={'+','-','*','/','(',')','#','^'};
int i,j;
for(i=0;i<8;i++)
if(m==ch[i])
break;
for(j=0;j<8;j++)
if(n==ch[j])
break;
return Prior[i][j];
}
void perfect(char s[])//将负号前面补零
{
char s1[100];
int i,j;
i=j=0;
if(s[0]=='-')
s1[j++]='0';
s1[j++]=s[i++];
while(s[i])
{
if(s[i]=='-'&&In(s[i-1])&&s[i-1]!=')')//负号的前面是运算符,但不是')'
{
s1[j++]='0';
s1[j++]=s[i++];
}
s1[j++]=s[i++];
}
s1[j]='\0';
i=0;
while(s1[i])
{
s[i]=s1[i];
i++;
}
s[i]='\0';
}
double EvaluateExpression()//表达式求值
{
char x,theta,z[100][20];
double a,b;
int i,j=0,k=0;
char s[100];
gets(s);
perfect(s);
SqStack1 OPTR;//寄存运算符
SqStack2 OPND;//寄存操作数和操作结果
InitStack(OPTR);
InitStack(OPND);
Push(OPTR,'#');
while(s[j]!='#'||GetTop(OPTR)!='#')
{
if(!In(s[j]))
{
i=0;
while(isdigit(s[j])||s[j]=='.')
{
z[k][i++]=s[j++];
}
Push(OPND,todouble(z[k]));
k++;
}
else
switch(Precede(GetTop(OPTR),s[j])){

case'<':Push(OPTR,s[j]);j++;break;
case'=':Pop(OPTR,x);j++;break;
case'>':Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}
}
return GetTop(OPND);
}
int main()
{
printf("%.2f\n",EvaluateExpression());
return 0;
}

热心网友 时间:2023-10-24 13:33

能进行加减乘除、乘方运算

#define Stack_init_size 100
#define Stack_add 10
#include <iostream>
using namespace std;
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cstdio>
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack1;
typedef struct{
double *base;
double *top;
int stacksize;
}SqStack2;
void InitStack(SqStack1 &S)//初始化栈
{
S.base=(char *)malloc(Stack_init_size*sizeof(char));
if(!S.base)
exit(1);
S.top=S.base;
S.stacksize=Stack_init_size;
return;
}
void InitStack(SqStack2 &S)//初始化栈
{
S.base=(double *)malloc(Stack_init_size*sizeof(double));
if(!S.base)
exit(1);
S.top=S.base;
S.stacksize=Stack_init_size;
return;
}
void Push(SqStack1 &S,char e)//将e压入栈中
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char *)realloc(S.base,(S.stacksize+Stack_add)*sizeof(char));
if(!S.base)
exit(1);
S.stacksize+=Stack_add;
}
*S.top++=e;
return;
}
void Push(SqStack2 &S,double e)//将e压入栈中
{
if(S.top-S.base>=S.stacksize)
{
S.base=(double *)realloc(S.base,(S.stacksize+Stack_add)*sizeof(double));
if(!S.base)
exit(1);
S.top=S.base+S.stacksize;
S.stacksize+=Stack_add;
}
*S.top++=e;
return;
}
bool Pop(SqStack1 &S,char &e)//出栈
{
if(S.base==S.top)
return false;
e=*(--S.top);
return true;
}
bool Pop(SqStack2 &S,double &e)//出栈
{
if(S.base==S.top)
return false;
e=*(--S.top);
return true;
}
char GetTop(SqStack1 &S)//返回栈顶元素
{
if(S.base==S.top)
return 0;
return *(S.top-1);
}
double GetTop(SqStack2 &S)//返回栈顶元素
{
if(S.base==S.top)
return 0;
return *(S.top-1);
}
bool In(char c)//判断字符c是否是运算符
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#'||c=='^')
return true;
return false;
}
double todouble(char s[]) //将字符串转化为小数
{
double val, power;
int i=0, sign;
sign = (s[i] == '-')? -1 : 1;
if(s[i] == '+' || s[i] == '-')
i++;
for(val = 0.0; isdigit(s[i]); i++)
{
val = val * 10 + (s[i] - '0');
}
if(s[i] == '.')
i++;
for(power = 1.0; isdigit(s[i]); i++)
{
val = 10.0 * val + (s[i] - '0');
power *= 10;
}
return sign * val / power;
}
double power(double a,double b)//计算a的b次方
{
double s=1.0;
for(int i=0;i<b;i++)
s=s*a;
return s;
}
double Operate(double a,char theta,double b)
{
switch(theta)
{
case'+':return a+b;
case'-':return a-b;
case'*':return a*b;
case'/':return a/b;
case'^':return power(a,b);
default:return 0;
}
}
char Precede(char m,char n)
{
char Prior[8][8] = { // 算符间的优先关系
'>','>','<','<','<','>','>','<',
'>','>','<','<','<','>','>','<',
'>','>','>','>','<','>','>','<',
'>','>','>','>','<','>','>','<',
'<','<','<','<','<','=',' ','<',
'>','>','>','>',' ','>','>','>',
'<','<','<','<','<',' ','=','<',
'>','>','>','>','<','>','>','>'
};
char ch[8]={'+','-','*','/','(',')','#','^'};
int i,j;
for(i=0;i<8;i++)
if(m==ch[i])
break;
for(j=0;j<8;j++)
if(n==ch[j])
break;
return Prior[i][j];
}
void perfect(char s[])//将负号前面补零
{
char s1[100];
int i,j;
i=j=0;
if(s[0]=='-')
s1[j++]='0';
s1[j++]=s[i++];
while(s[i])
{
if(s[i]=='-'&&In(s[i-1])&&s[i-1]!=')')//负号的前面是运算符,但不是')'
{
s1[j++]='0';
s1[j++]=s[i++];
}
s1[j++]=s[i++];
}
s1[j]='\0';
i=0;
while(s1[i])
{
s[i]=s1[i];
i++;
}
s[i]='\0';
}
double EvaluateExpression()//表达式求值
{
char x,theta,z[100][20];
double a,b;
int i,j=0,k=0;
char s[100];
gets(s);
perfect(s);
SqStack1 OPTR;//寄存运算符
SqStack2 OPND;//寄存操作数和操作结果
InitStack(OPTR);
InitStack(OPND);
Push(OPTR,'#');
while(s[j]!='#'||GetTop(OPTR)!='#')
{
if(!In(s[j]))
{
i=0;
while(isdigit(s[j])||s[j]=='.')
{
z[k][i++]=s[j++];
}
Push(OPND,todouble(z[k]));
k++;
}
else
switch(Precede(GetTop(OPTR),s[j])){

case'<':Push(OPTR,s[j]);j++;break;
case'=':Pop(OPTR,x);j++;break;
case'>':Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}
}
return GetTop(OPND);
}
int main()
{
printf("%.2f\n",EvaluateExpression());
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
万能粉碎机清洁规程 中药粉碎机如何清洗比较好 磨粉机能用水洗吗 正确的家用粉碎机清洗方法 粉碎机清洗不干净粉碎机怎么清洗才干净 励志语句长句精选123句 caxa如何保存图幅模板 美迪特MDT-IN158重要参数 打玻尿酸已一个月眼睛疼,会不会打玻尿酸一个月,突然眼睛疼会不会... 玻尿酸失明概率真的小吗-玻尿酸失明有光感还能恢复吗 陈华军人物简介 利用栈求表达式的值,可供小学生作业,并能给出分数(数据结构) 实现表达式求值至少要几个栈 C++栈的应用:表达式求值 用栈实现表达式的求值 数据结构中怎样用栈来表示表达式算法 利用C语言 数据结构 栈 两种方法实现表达式的自动计算 怎么用C语言栈实现表达式求值 利用数据结构中的栈实现表达式求值 例如4+2*(10-3)-10&#47;5 先只考虑整型,不考虑double型 《C语言编写》用栈完成表达式求值(顺序存储) C语言用栈实现表达式求值 利用栈求表达式((A-B)-C)-(D-(E-F))的值,运算符栈和操作数栈各必须具有多少项? 我被剃须刀的刀片割出血了,要打破伤风针吗 C语言用栈编写求表达式的值 为什么我腿上好多毛?该怎么办? 怎么用栈实现算术表达式的算法 为什么人腿上长毛不是身体呢?很好奇 我为什么一用刮胡刀就会出血 用C/C++ 编写“利用栈实现表达式求值” 数据结构:利用栈来实现算术表达式求值的算法。 用刀片刮胡子总出血怎么办? 河南上蔡县红砖头多少钱一块 《赌神》中阿珍谁演的,阿珍扮演者 刺青海娘中阿珍的扮演者 家用换气扇电机红黄蓝三根线连线方法 电视剧刺青中扮演阿珍的演员是谁 刺青电视剧阿珍的扮演者 股票涨不上去也跌不下去 换气扇是三根线,可电线是两根线,怎么接,急急急!!! 刺青阿珍扮演者 阿珍谁演的? 为什么我买的股票只跌不涨呢? 刺青阿珍扮演者是谁 一触即发中阿珍的扮演者 谁知道电影(打工皇帝)阿珍的扮演者是谁? 股票跌不下去涨不上来代表什么 刺青 阿珍的扮演者 为什么我买什么股票,什么股票就跌?有的都观望了好几个星期了,整体天天涨,但我买了之后就再也不涨了? 功夫中阿珍的扮演者 情不自禁之想入非非阿珍的扮演者 为什么有的股票,有利好消息却不涨甚至下跌呢?