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

c语言版数据结构课程设计利用栈求表达式的值,加减乘除,带括弧的混合运算。

发布网友 发布时间:2023-02-17 08:43

我来回答

1个回答

热心网友 时间:2023-09-19 21:34

跟你的要求符合
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define MAXLEN 100
typedef struct
{
char op;
int level;
}opt;
typedef struct //定义操作符栈
{
opt st[MAXLEN];
int top;

}op_stack;

typedef struct //定义值栈
{
double D[MAXLEN];
int top;
}D_stack;
//--------对栈操作的定义-------------
opt peek(op_stack *s) //定义看栈顶函数
{
opt error={'$',-2};
if(s->top>=0)
return s->st[s->top];
else
return error;
}
int IsEmpty(op_stack *s) //定义判断栈空的函数
{

if(s->top<0)
return 0;
else
return s->st[s->top].op;
}

char push(op_stack *s,opt c) //定义入栈函数
{
s->top++;
s->st[s->top]=c;
return c.op;
}

opt pop(op_stack *s) //定义出栈函数
{
opt i;
opt error={'$',-2};
if(s->top>=0)
{
i=s->st[s->top];
s->st[s->top].op='\0';
s->top--;
return i;
}
else
return error;
}

void clear(op_stack *s) //定义初始化栈
{
s->top=-1;
}
//-----------------------------define the value stack-----------------------
double Dpeek(D_stack *s) //定义看栈顶函数
{
if(s->top>=0)
return s->D[s->top];
else
return 0;
}
int DIsEmpty(D_stack *s) //定义判断栈空的函数
{

if(s->top<0)
return 0;
else
return (int)(s->D[s->top]);
}

double Dpush(D_stack *s,double c) //定义入栈函数
{
s->top++;
s->D[s->top]=c;
return c;
}
double Dpop(D_stack *s) //定义出栈函数
{
double i;
if(s->top>=0)
{
i=s->D[s->top];
s->D[s->top]='\0';
s->top--;
return i;
}
else return 0;
}

void Dclear(D_stack *s) //定义初始化栈
{
s->top=-1;
}

double calval(char *exp)
{
op_stack os; //定义两个栈
D_stack ds;
char tmp[MAXLEN]={'\0'};
int i=0,leng;
double dtmp,dpoptmp;

opt A={'+',1};
opt R={'-',1};
opt M={'*',2};
opt D={'/',2};
opt B={'(',-1};
opt Mo={'%',2};

clear(&os);
Dclear(&ds);

//-----定义初始化结束-----
while(*exp!='\0')
{

while(*exp >= '0' && *exp <= '9' || *exp == '.')
{
while(*exp >= '0' && *exp <= '9' || *exp == '.')
{
tmp[i++]=*exp++;
}

dtmp=atof(tmp);
Dpush(&ds,dtmp);
leng=strlen(tmp);
for(i=0;i<leng;i++)
{
tmp[i]='\0';
}
i=0;
}
//-------------------------------

switch(*exp)
{
case '+' :
if(!IsEmpty(&os) || peek(&os).level < A.level)
{
push(&os,A);
*exp++;
}
else
{
while(IsEmpty(&os) && peek(&os).level>=A.level)
{
switch(pop(&os).op)
{
case '%':
dpoptmp=Dpop(&ds);
dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);
Dpush(&ds,dpoptmp);
break;

case '*' :
dpoptmp=Dpop(&ds)*Dpop(&ds);
Dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=Dpop(&ds);
dpoptmp=Dpop(&ds)/dpoptmp;
Dpush(&ds,dpoptmp);
break;
case '+':
dpoptmp=Dpop(&ds)+Dpop(&ds);
Dpush(&ds,dpoptmp);
break;
case '-':
dpoptmp=Dpop(&ds);
dpoptmp=Dpop(&ds)-dpoptmp;
Dpush(&ds,dpoptmp);
break;
}
}
push(&os,A);
*exp++;
}
break;
case '-':
if(!IsEmpty(&os) || peek(&os).level < R.level)
{
push(&os,R);
*exp++;
}
else
{
while(IsEmpty(&os) && peek(&os).level>=R.level)
{
switch(pop(&os).op)
{
case '%' :
dpoptmp=Dpop(&ds);
dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);
Dpush(&ds,dpoptmp);
break;

case '*' :
dpoptmp=Dpop(&ds)*Dpop(&ds);
Dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=Dpop(&ds);
dpoptmp=Dpop(&ds)/dpoptmp;
Dpush(&ds,dpoptmp);
break;
case '+':
dpoptmp=Dpop(&ds)+Dpop(&ds);
Dpush(&ds,dpoptmp);
break;
case '-':
dpoptmp=Dpop(&ds);
dpoptmp=Dpop(&ds)-dpoptmp;
Dpush(&ds,dpoptmp);
break;
}
}
push(&os,R);
*exp++;
}
break;

case '*':
if(!IsEmpty(&os) || peek(&os).level < M.level)
{
push(&os,M);
*exp++;
}
else
{
while(IsEmpty(&os) && peek(&os).level>=M.level)
{
switch(pop(&os).op)
{
case '%' :
dpoptmp=Dpop(&ds);
dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);
Dpush(&ds,dpoptmp);
break;

case '*' :
dpoptmp=Dpop(&ds)*Dpop(&ds);
Dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=Dpop(&ds);
dpoptmp=Dpop(&ds)/dpoptmp;
Dpush(&ds,dpoptmp);
break;
}
}
push(&os,M);
*exp++;
}
break;
case '/':
if(!IsEmpty(&os) || peek(&os).level < D.level)
{
push(&os,D);
*exp++;
}
else
{
while(IsEmpty(&os) && peek(&os).level>=D.level)
{
switch(pop(&os).op)
{
case '%' :
dpoptmp=Dpop(&ds);
dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);
Dpush(&ds,dpoptmp);
break;
case '*' :
dpoptmp=Dpop(&ds)*Dpop(&ds);
Dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=Dpop(&ds);
dpoptmp=Dpop(&ds)/dpoptmp;
Dpush(&ds,dpoptmp);
break;
}
}
push(&os,D);
*exp++;
}
break;
case '%':
if(!IsEmpty(&os) || peek(&os).level < Mo.level)
{
push(&os,Mo);
*exp++;
}
else
{
while(IsEmpty(&os) && peek(&os).level>=Mo.level)
{
switch(pop(&os).op)
{
case '%' :
dpoptmp=Dpop(&ds);
dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);
Dpush(&ds,dpoptmp);
break;
case '*' :
dpoptmp=Dpop(&ds)*Dpop(&ds);
Dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=Dpop(&ds);
dpoptmp=Dpop(&ds)/dpoptmp;
Dpush(&ds,dpoptmp);
break;
}
}
push(&os,Mo);
*exp++;
}
break;
case '(':
push(&os,B);
exp++;
break;

case ')':
while(peek(&os).level!=-2)
{
switch(pop(&os).op)
{
case '%' :
dpoptmp=Dpop(&ds);
dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);
Dpush(&ds,dpoptmp);
break;

case '*' :
dpoptmp=Dpop(&ds)*Dpop(&ds);
Dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=Dpop(&ds);
dpoptmp=Dpop(&ds)/dpoptmp;
Dpush(&ds,dpoptmp);
break;
case '+':
dpoptmp=Dpop(&ds)+Dpop(&ds);
Dpush(&ds,dpoptmp);
break;
case '-':
dpoptmp=Dpop(&ds);
dpoptmp=Dpop(&ds)-dpoptmp;
Dpush(&ds,dpoptmp);
break;
}
}
pop(&os); //弹出 (
exp++;
break;
}
}
while(IsEmpty(&os))
{
switch(pop(&os).op)
{
case '%' :
dpoptmp=Dpop(&ds);
dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);
Dpush(&ds,dpoptmp);
break;

case '*' :
dpoptmp=Dpop(&ds)*Dpop(&ds);
Dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=Dpop(&ds);
dpoptmp=Dpop(&ds)/dpoptmp;
Dpush(&ds,dpoptmp);
break;
case '+':
dpoptmp=Dpop(&ds)+Dpop(&ds);
Dpush(&ds,dpoptmp);
break;
case '-':
dpoptmp=Dpop(&ds);
dpoptmp=Dpop(&ds)-dpoptmp;
Dpush(&ds,dpoptmp);
break;
}

}

return Dpop(&ds);
}

void main()
{
char string[MAXLEN];
char *p=string;
printf("输入表达式:\n");
gets(p);
printf("%s=%f\n\n",string,calval(p));
}

参考资料:http://blog.sina.com.cn/s/blog_5b4772b00100ez2u.html

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
计算∫L√x^2+y^2ds,其中L为xoy平面上的圆周x^2+y^2=2x ∮√x^2+y^2ds(其中L为圆周x^2+y^2=ax)的值是多少? 高等数学,第一类曲线积分:计算√x^2 +y^2ds,其中L为圆周x2 +y2 =4x? 设L是圆周x^2+y^2=1在第一象限的部分,则曲线积分∫Lxy^2ds=? 计算∫根号下x^2+y^2ds,其中L为x=根号下a^2-y^2,y=x,y=0围成的闭... ∫l3xdx+2ydy= ,其中l为x²+y²=1的封闭曲 绝代双骄2江湖凶险 为什么我下的新绝代双骄前传不能玩? 大侠帮我过过新绝代双骄2的任务。 我的人类来源哪里?? 如果是猿猴,那猿猴来源哪里?? 利用栈求表达式的值,可供小学生作业,并能给出分数。包括功能分析,程序流程,设计思想。求高手解答。 交换机在端口上学习mac地址的类型和方法 列举目前3种安装mac os的硬件设备,并简单介绍. 五味子煲汤的配方 5种五味子煲汤食谱推荐! 怎样把QQ的背景弄成淡蓝色的? 一定要手把手教我哦 蚝油彩椒鸡翅怎么做蚝油彩椒鸡翅如何做 绝地求生全军出击单排怎么玩 单排吃鸡玩法攻略 和声望有关的词语,最好是四字的,描述特点的。 描写老人高尚品格的词语 大厨四宝鲜香粉八斤水放多少克 改了qq背景上面是蓝色的 婚包是男方买还是女方 结婚需要买婚包吗 声誉的反义词_声誉的近义词_声誉的词语解释 猪净排和猪肋排有什么区别 声威的同义词 肉沫蒸蛋的制作方法和步骤 近义词舒适、声望、隆重、尴尬 蛋糕海盐夹层是什么意思 扣扣和微信上发视频,为啥有的有时间限制,有的没有?咋发的?有时间限制的咋保存到手机? 十岁孩子叛逆有什么办法 大义凛然的同义词有哪些及造句 被覆盖怎样找回? 同一个手机号,申请了两个,后一个把前一个覆盖了,怎么找回前? 净水器气泡水功能 捡到手机不知道密码怎么办 怎么挑选伽师瓜 东莞捷荣新厂怎么样 东莞捷荣技术股份有限公司北京分公司怎么样? 什么是茶烟 茶烟简述 洗脸毛巾怎么选 怎么用毛巾洗脸最好 rog幻16电池不充电 被覆盖怎样找回? 同一个手机号,申请了两个,后一个把前一个覆盖了,怎么找回前? 万圣诞打一个生肖 AF的对焦框怎么去掉? 拜年祝福语简短老师 新年祝福语老师大全 简短2023 新年祝福词祝福语大全精选60句 怀孕47天孕酮16正常吗 米菲司酮