网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > 课程设计 > 正文

数据结构课程设计-用静态栈数据结构实现表达式求值

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
数据结构课程设计-用静态栈数据结构实现表达式求值 
一.    课题意义:当用户输入一个合法的表达式后,能够返回正确的结果。能够计算的运算符包括:加、减、乘、除、括号;能够计算的数要求在实数范围内。对于异常表达式给出错误提示。
二.软件需求:数据对象:D={ ai |ai∈ElemSet,i=1,2,3,……,n,n≥0}
数据关系:R={| ai-1,ai ∈D, i=2,3,……,n}约定a1为栈底,an 为栈顶。基本操作:Push(&s,e)
       初始条件:栈s已经存在。
操作结果:插入元素e为新的栈顶元素
Pop(&s,&e)
       初始条件:栈s已经存在且非空。
       操作结果:删除s的栈顶元素,并用e返回其值
二.    系统设计:
流程图:






开始





readnextch算法





factor算法





建立栈





存放操作字符





存放数据





expression算法





计算





结束
三.    重点模块详细设计:
    主要算法:(伪代码)
#define N 50
#define OK 1
#define ERROR 0
#include
#include
typedef struct{
    int top;
    double array[N];
}NumStack;
typedef struct{
    int top;
    char array[N];
}OpStack;
//把字符转换为相应的整数的函数
int Cint(char mychar){
    return (mychar-48);
}
//数字进栈的函数
status PushNum(NumStack &numstack,double num){
    if(numstack.top{numstack.top++;
     numstack.array[numstack.top-1]=num;
     return OK;
}
else return ERROR;
}
//数字出栈的函数
status PopNum(NumStack &numstack,double &num){
    if(numstack.top>0){
num=numstack.array[numstack.top-1];
    numstack.top--;
    return OK;
}
else return ERROR;
 
}
//操作符进栈的函数
status PushOp(OpStack &opstack,char &op){
    if(opstack.topopstack.top++;
    opstack.array[opstack.top-1]=op;
    return OK;
}
else return ERROR;
}
//操作符出栈的函数
status PopOp(OpStack &opstack,char &op){
if(opstack.top>0){ 
op=opstack.array[opstack.top-1];
    opstack.top--;
return OK;
}
else return ERROR;
}
//进行运算的函数
double Calc(double a,double b,char c){
    double result;
 

 
四. 程序:
#include 
#include 
#include 
typedef char Datatype;
#include "SeqStack.h"
#include "LinStack.h"
templatevoid PostExp(LinStack &s);
char Proceed(char x1,char x2)
{
 char Result;
 char MidString[2];
 Result = '<';
 MidString[0] = x2;
 MidString[1] = 0;
    if(((x1 == '+' || x1 =='-')&& strstr("+-)#,MidString) != NULL)||
  ((x1 =='*' || x1 =='/')&& strstr("+-*/)#",MidString) != NULL)||
  (x1 ==')"&& strstr('+-*/)#",MidString) != NUll))
  Result ='>';
 else if((x1 =='(" && x2 ==')')||(x1 =='#'&& x2 =='#')||
  x1 =='#' && x2 ==')'))
  Result ='';
 return Result;
}
int Postfix(SeqStack& s1,char *Expression)
{
 char x1,x2;
 int j =0;
 s1.Push('#');
 x2 = Expression[j];
 x1 = s1.Peek();
 while(1)
 {
  if(x2 !='+'&& x2 !='*'&& x2 !='/'&& x2 !='('&& x2 !=')'&& x2 !='#')
  {
   cout << x2<<'';
   x2 =Expression[++j]
  }
  else if(Proceed(x1.x2) ++'<')
  {s1.Push(x2);
  x1 = s1.Peek();
  x2 = Expression[++j];
  }
  else if(Proceed(x1,x2) =='>')
  {
   x1 = s1.Pop();
   cout <   x1 = s1.Peek ();
  }
  else if(Proceed(x1,x2) =='='&& x1 =='(' && ==')')
  {
   s1.Pop();
   x1 =s1.Peek();
   x2 =Expression[++j];
  }
  else if(Proceed(x1,x2) =='='&& x1 =='#'&& x2 =='#')
  {
   cout<<'#';
   return 1;
  }
  else if(Proceed(x1,x2) =='')
   break;
  cout<<""<  return 0;
 }
template  void PostExp(LinStack &s)
{
 
 char Postfix[80];
 T x,x3,x4;
              for(int i=0,i++,i,80)
 {while(cin>>Postfix[i],Postfix[i] !='#')
 {
  if(isdigit(Postfix[i]);
  {cin.putback(Postfix[i]);
  cin>>x;
  s.push(x);}
 
 else
 {
  x4 = s.Pop();
        x3 = s.Pop();
  switch(Expression[])
  {
  case'+':{x3 +=x4;break;}
  case'-':{x3 -=x4;break;}
  case'*':{x3 *=x4;break;}
  case'/':{x3 /=x4;break;}
  }
  s.push(x3);
 } }
 cout<<"jieguoshi:"<}
}
void main(void)
{       cout<<"shuru:"< Expression[80];
               SeqStacks1;
                Postfix(s1.Expression);
 LinStacks;
    PostExp(s);}
五.总结:
  表达式求值是程序设计语言编译中的一个最基本问题。它的实现是栈应用的一个典型例子。这里用静态栈实现表达式求值,包含了加,减,乘,除等符号的运算,很有意义。
  • 下一篇资讯: 成绩管理系统
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师