C语言版数据结构课程设计利用栈求表达式的值

编写程序实现表达式求职,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。
主要功能叙述如下:
1.从键盘上输入表达式。
2.分析该表达式是否合法
(1)是数字,则判断该数字的合法性,若合法,则压入数据到堆栈中
(2)是规定的运算符,则根据规则进行处理。在处理过程中计算该表达式的值。
(3)若是其他字符,则返回错误信息
3.若上述处理没有发现错误,则认为该表达式合法。
程序应包括以下几个功能函数
void initstack();初始化堆栈
int Make_str();语法检查并计算
int push_operate(int operate):将操作码压入堆栈
int push_num(double num):将操作数压入堆栈
int procede(int operate):处理操作码
int change_opnd(int operate):将字符型操作码转换成优先级
int push_opnd(int operate):将操作码压入堆栈
int pop_opnd();将操作码弹出堆栈
int caculate(interru_opnd):简单计算 +,-,*,/
double pop_num():弹出操作数


跟你的要求符合
#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=;
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=;
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]=;
int i=0,leng;
double dtmp,dpoptmp;

opt A=;
opt R=;
opt M=;
opt D=;
opt B=;
opt Mo=;

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));
}
温馨提示:内容为网友见解,仅供参考
无其他回答

C语言 任意表达式求值。(栈的应用
int s1[n0+1]; \/\/操作数栈 char s2[n0+1]; \/\/运算符栈 int t1,t2;int num[4]; \/\/提取表达式中的整数 void calcu() \/\/一次计算 { int x1,x2,x;char p;\/\/弹出一个运算符 p=s2[t2--];\/\/弹出两个操作数 x2=s1[t1--];x1=s1[t1--];\/\/进行一次运算 switch(p) { case ...

《数据结构 课程设计》表达式求值 实验报告
在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。二、 系统分析 1. 以...

数据结构c语言版表达式求值标准程序
link head; \/\/ 指向栈顶第一个有效对象

栈的应用举例:数制转换,表达式求值
关于表达式的分析与求值是计算机软件专业中“编译原理”课程极其重要的部分,主要用于最初的词法分析。其表示方式有:前缀、中缀、后缀表示法。其数据结构可以使用一个堆栈来表示。具体的实现代码,我以前使用的书籍是《C语言大全》,那上面就有完整的、现成的代码,可以供你参考运行。同时你还可以参考《编译...

关于数据结构的问题,用C语言描述
采用一种数据结... 1. 设一函数 f(x,y)=(1+A*(e^B\/cosθ)*(1+C*(cosψ)^2),其中θ=(π*x)\/180,ψ=(π*y)\/180,参数A=-0.5,B=-0.4,C=-0.1。x从0变化到89,步长为1,y从0变化到359,步长为1。采用一种数据结构,完成f(x,y)的存储。2.上题的f(x,y)是实数值,请通过线性变化求出...

数据结构(C语言版)题:由一个栈的输入序列12345,设计算法,分别输出54321...
54321:1~5这5个数连续进栈后再5个数连续出栈,用2个循环就可以了 32145:1~3这3个数连续进栈后再3个数连续出栈,也可以用2个循环,然后是4进4出,5进5出

什么是表达式? 表达式的值一般是怎么计算出来的?
表达式分算数表达式和赋值表达式两种,具体解释请参考谭浩强的《C语言程序设计》第三版59页

C语言数据结构,用栈编一个程序,判断一个字符串是否为回文
用数组模拟栈,然后分情况讨论!include <stdio.h>#include <stdlib.h>#include <string.h>int IsPalindrome(const char *cScr);void main(void){ char cStr[21]; while (1) { gets(cStr); printf("%d\\n", IsPalindrome(cStr)); }}int IsPalindrome(const char ...

数据结构课程设计(C语言版) 一元稀疏多项式的运算
输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。序列按指数降序排列;⑶ 多项式A和B相加,建立多项式A+B,输出相加的多项式;⑷ 多项式A和B相减,建立多项式A-B,输出相减的多项式;⑸ 设计一个菜单,上述操作要求的基本功能。

数据结构中用C语言写:利用栈实现十进制数 N和其它 d进制数的转换。
1、首先在桌面上,点击“Microsoft Visual Studio 2010”图标。2、然后在该界面中,输入初始化栈的代码“void InitStack(SqStack *SS){ SS->base = (SqNode *)malloc(sizeof(SqNode)); SS->top = SS->base;}”。4、之后在该界面中,输入压栈的代码“int PushStack(SqStack *SS,int e){ ...

相似回答