严蔚敏《数据结构》表达式求值
容器:两个栈,一个存放字符CS,一个存放数字S;两个数组,一个放中缀表达式c[N],一个放逆波兰式s[N]
方式:1.先将中缀表达以字符的形式全部输入(运用了gets()函数)并放到一个数组c[N]中;
2.求逆波兰式,遍历数组c[N],利用isdigit()函数判断字符数组里面的字符是数字字符还是非数字字符,是数字字符的话,将其放入数组s[N],s[N]中利用,作为分隔符;遍历c[N],遇到+,-,(则将他们放入CS中,遇到)则不用把他放入CS,然后POP字符栈中的元素,判断元素是否为(,如果是(,则把(POP出来,继续访问数组c[N],遇到*或者/则要把他放入s[N]中,还要判断CS中是否有(,有的话,还要全部POP出CS中的元素,并放入s[N]中。
3.求值,先处理s[N]数组,利用atoi()函数将数字字符(char型)转化为(int型),然后把它放入数字栈S,遇到操作符就POP两个数字,进行计算,如此重复。

#include<bits/stdc++.h>
using namespace std;
#define N 100#define STACK_INIT_SIZE 5
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0typedef char CSElemType;
typedef int SElemType;typedef int Status;//字符栈
typedef struct{//栈的顺序存储表示 CSElemType *top;//栈顶 CSElemType *base;//栈底 int cstacksize;//栈当前存储空间
}CSqStack;//数字栈
typedef struct{//栈的顺序存储表示 SElemType *top;//栈顶 SElemType *base;//栈底 int stacksize;//栈当前存储空间
}SqStack;//字符栈的初始化
Status InitCStack(CSqStack &CS)
{CS.base=(CSElemType*)malloc(sizeof(CSElemType)*STACK_INIT_SIZE);if(!CS.base){exit(OVERFLOW);}CS.top=CS.base;CS.cstacksize=STACK_INIT_SIZE;return OK;
}//数字栈的初始化
Status InitStack(SqStack &S)
{S.base=(SElemType*)malloc(sizeof(SElemType)*STACK_INIT_SIZE);if(!S.base){exit(OVERFLOW);}S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;
}//判断字符栈是否为空
Status CStackEmpty(CSqStack &CS)
{if(CS.top==CS.base){return OK;}else{return ERROR;}
}//判断数字栈是否为空
Status StackEmpty(SqStack &S)
{if(S.top==S.base){return OK;}else{return ERROR;}
}//判断字符栈是否满
Status CStackFull(CSqStack &CS)
{if(CS.top-CS.base>=CS.cstacksize){return OK;}else{return ERROR;}
}//判断数字栈是否满
Status StackFull(SqStack &S)
{if(S.top-S.base>=S.stacksize){return OK;}else{return ERROR;}
}//用e返回栈顶元素的值
Status GetTop(SqStack S,SElemType &e)
{if(StackEmpty(S)){return ERROR;}e=*(S.top-1);return OK;
}//将字符e插入栈顶
Status CPush(CSqStack &CS,CSElemType e)
{if(CStackFull(CS)){CS.base=(CSElemType*)realloc(CS.base,sizeof(CSElemType)*(CS.cstacksize+STACK_INIT_SIZE));if(!CS.base){exit(OVERFLOW);}CS.top=CS.base+CS.cstacksize;CS.cstacksize+=STACKINCREMENT;}*CS.top++=e;return OK;
}//将数字e插入栈顶
Status Push(SqStack &S,SElemType e)
{if(StackFull(S)){S.base=(SElemType*)realloc(S.base,sizeof(SElemType)*(S.stacksize+STACK_INIT_SIZE));if(!S.base){exit(OVERFLOW);}S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;
}//取出字符栈顶元素,用e返回其值
Status CPop(CSqStack &CS,CSElemType &e)
{if(CStackEmpty(CS)){return ERROR;}e=*--CS.top;return OK;
}//取出数字栈顶元素,用e返回其值
Status Pop(SqStack &S,SElemType &e)
{if(StackEmpty(S)){return ERROR;}e=*--S.top;return OK;
}//展示数字栈的元素
void DisplayStack(SqStack &S)
{int i;SqStack t;SElemType e;printf("请输出栈顶的元素:");while (!StackEmpty(S)){Pop(S,e);printf("%d\n",e);Push(t,e);} while (!StackEmpty(t)){Pop(t,e);Push(S,e);} printf("\n");return;
}//回收栈
Status DestroyStack(SqStack &S)
{free(S.base);S.base=NULL;S.stacksize=0;return OK;
} Status RPoland(char c[],char *s)
{//求逆波兰 CSqStack CS;InitCStack(CS);int j=0;char e;for(int i=0;i<strlen(c);i++){if(isdigit(c[i]))//判断字符串里面是否有数字,有的话,把这个数字放入新的数组s里面 {s[j]=c[i];j++;if(isdigit(c[i+1])){continue;}if(!CStackEmpty(CS)){CPop(CS,e);if(e=='*'||e=='/'){s[j]=',';j++;s[j]=e;j++;s[j]=',';j++;while(!CStackEmpty(CS)){CPop(CS,e);if(e!='('){s[j]=e;j++;}else if(e=='('){break;}}       }       else{CPush(CS,e);}}}else if(c[i]=='+'||c[i]=='-'){if(!CStackFull(CS)){CPush(CS,c[i]);s[j]=',';j++;}}else if(c[i]=='('){if(!CStackFull(CS)&&c[i+1]!='-'){CPush(CS,c[i]);   }if(!CStackFull(CS)&&c[i+1]=='-'){CPush(CS,c[i]);s[j]='0';j++;    }   } else if(c[i]==')'){do{CPop(CS,e);if(e!='('){s[j]=',';j++;s[j]=e;j++;   }if(e=='('){break;  } }while(!CStackEmpty(CS)&&e!='(');}else if(c[i]=='*'||c[i]=='/'){       CPush(CS,c[i]);s[j]=',';j++; }}while(!CStackEmpty(CS)){CPop(CS,e);s[j]=',';j++;s[j]=e;j++;}return OK;
}Status Evaluate(char s[])
{SqStack S;InitStack(S);int r=0;char str[N];SElemType e0,e1,e2;for(int k=0;k<strlen(s);k++){   if (isdigit(s[k])){str[r]=s[k];r++;//cout<<endl;//cout<<"r="<<r<<endl;if (s[k+1]==','){str[r]='\0';Push(S,atoi(str));//cout<<endl;//cout<<"atoi(str)="<<atoi(str)<<endl; r=0;}else{continue;}}if(s[k]=='+'||s[k]=='-'||s[k]=='*'||s[k]=='/'){if(s[k]=='+'){Pop(S,e1);Pop(S,e2);e0=e1+e2;Push(S,e0);}if(s[k]=='-'){Pop(S,e1);Pop(S,e2);cout<<endl;e0=e2-e1;Push(S,e0);}if(s[k]=='*'){Pop(S,e1);Pop(S,e2);e0=e1*e2;Push(S,e0);}if(s[k]=='/'){Pop(S,e1);Pop(S,e2);e0=e2/e1;Push(S,e0);}}}Pop(S,e0);printf("结果为:");printf("%d",e0);return OK;
}
int main()
{char c[N];//存放中缀表达式 char s[N];//存放后缀表达式printf("请输入中缀表达式:");scanf("%s",c);RPoland(c,s);printf("输出后缀表达式:");for(int k=0;k<strlen(s)-1;k++){printf("%c",s[k]);}printf("\n");Evaluate(s);return 0;
}

代码冗长,还有瑕疵,新手上路,多多关照,欢迎大家留言和私信!

严蔚敏《数据结构》表达式求值相关推荐

  1. 如何利用计算机求函数解析式,数据结构表达式求值(计算器)实验报告(共10篇).doc...

    数据结构表达式求值(计算器)实验报告(共10篇) 数据结构表达式求值(计算器)实验报告(共10篇) 数据结构课程设计_实验报告(一)表达式求值(计算器) 数据结构课程设计 实验报告 起止时间:2015 ...

  2. [数据结构]表达式求值

    一.问题描述 表达式求值是数学中的一个基本问题,也是程序设计中的一个简单问题.我们所涉及的表达式中包含数字和符号,本实验中处理的符号包括'+'.'-'.'*'.'/'.'('和')',要求按照我们所习 ...

  3. 数据结构——表达式求值

    1.介绍 表达式分为中缀表达式,后缀表达式和前缀表达式. 前缀表达式又叫波兰式,而后缀表达式又叫逆波兰式,因为一开始研究这个的是个波兰数学家. 其中,我们最熟悉的就是中缀表达式.如下: (15-2)* ...

  4. 算术表达式求值的程序设计与实现_数据结构课程设计

    以下内容可且仅可供参考,如有错误欢迎指正. 部分思路借鉴算术表达式求值(C语言栈)_夜何其的博客-CSDN博客_c语言利用栈求解算术表达式侵删致歉 <算术表达式求值的程序设计与实现>题目要 ...

  5. 严蔚敏《数据结构》C语言版 第三章 算法3.4 表达式求值

    这个我是看到华为今年招聘的机试题的第三题. 输入一串算术表达式的字符串,把它的结果算出来. 1 //表达式求值(输入.输出和中间结果均只能是0-9)运算符仅限+-*/. 2 #include < ...

  6. python前缀表达式求值_python数据结构与算法 11 后缀表达式求值

    从本节开始,删除原版的英文,直接发译后的文稿. 后缀表达式求值 栈的最一个应用例子,计算一个后缀表达式的值.这个例子中仍然用栈的数据结构.不过,当扫描表达式的时候,这次是操作数压栈等待,不是转换算法中 ...

  7. c语言中缀表达式求值_数据结构考研笔记之栈与队列(四)栈与队列应用括号匹配、中缀表达式转前缀后缀问题...

    文字:独木 排版:独木 图片:独木 栈与队列 1.括号匹配问题 栈 例题1 例题2-----不匹配例题1 例题3-----不匹配例题2 2. 表达式求值问题 例题 1.中缀表达式转前缀表达式 2.中缀 ...

  8. linux算术表达式求值数据结构,数据结构:算数表达式求值演示

    题目:设计一个程序,演示用算符优先法对算数表达式求值的过程. 一.需求分析 以字符序列的形式从终端读入输入语法正确.不含变量的整数表达式.利用教科书表3.1给出的算符优先关系,实现对算数四则混合运算表 ...

  9. 数据结构—— 基于二叉树的算术表达式求值

    实验五 基于二叉树的算术表达式求值 数据结构--中序表达式求值(栈实现) 实验目的: 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法. 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于 ...

  10. python 表达式求值数据结构_python 数据结构与算法

    python 数据结构与算法 1 python常见数据结构性能 1.1 List 1.1.1 安索引取值和赋值 1.1.2 列表append和__add__() 1.1.3 使用timeit模块测试执 ...

最新文章

  1. 最近的生活[发点牢骚]
  2. SpringMVC入门案例
  3. Python 一次for遍历多个列表及遍历时获取index
  4. [elk]logstash grok原理
  5. 【数据结构与算法】之深入解析“游乐园的迷宫”的求解思路与算法示例
  6. 【Servlet】JSP学习-概念和运行原理
  7. 如何启用 SAP Business Technology Platform 上的 Mobile Services
  8. mfc链表中的数据如何排序输出_java程序员面试中最容易被问到的18个算法题(附答案!)...
  9. 暴力 Codeforces Round #183 (Div. 2) A. Pythagorean Theorem II
  10. 蓝牙遥控开关c语言程序,单片机蓝牙控制开关制作(程序源码+安卓APP分享)
  11. Silverlig“.NET研究”ht性能优化纪要
  12. 【学术】SCI 写作常用句式总结一(Introduction篇)
  13. jenkins 全局工具配置
  14. 永久免费!永洪科技发布桌面智能数据分析工具Desktop,推动数据应用平民化
  15. Linux下gdb(插件pwndbg、pead、gef)安装及调试常用指令
  16. POJ 3426 Doors and... more doors 可能会
  17. Cesium隐藏版权信息
  18. python自动测试优惠券过期_python逻辑回归模型-使用优惠券预测
  19. 三维地形图建模仿真与Matlab之间的数据交换
  20. Android WebRTC 入门教程(二) -- 模拟p2p本地视频传输

热门文章

  1. xss.haozi.me通关记录
  2. Win10任务栏图标变成空白方块解决办法
  3. SqlServer 远程主机强迫关闭了一个现有的连接
  4. Array Shrinking(区间DP)
  5. Dockerfile: max depth exceeded
  6. 虾皮的发货模式是什么?怎么发货?
  7. oracle nlv 全称,oracle: OCA-047-题解与实验(9)--SQL语句中COUNT和NLV的用法
  8. 随心所欲的“四舍五入” 之 ROUNDUP函数如何使用?
  9. 网络编程之OSI七层模型,讲解tcp/ip五层涉及的网络协议,网络通信实现,结合协议来看网络通信流程...
  10. python实现1分钟内股价波动邮件提示