后缀算术表达式的后缀式求值

后缀表达式求值的源代码
后缀表达式求值的源代码
上传大小:4KB
这是数据结构里的一个后缀表达式求值问题,小数和十位上的数计算都能求值
主要用到栈
综合评分:0(0位用户评分)
所需积分/C币:
下载个数:12
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var q = $("#form1").serializeArray();
console.log(q);
var res_area_r = $.trim($(".res_area_r").val());
if (res_area_r == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
var mess = $(".res_area_r").val();
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, _username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click",'.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
$(".res_area_r").val($.trim($(".res_area").val()));
评论共有0条
审核通过送C币
6套慕课网算法视频教程
创建者:love
VS2010趣味编程视频教程
创建者:ouyongke
OMNET学习资料
上传者其他资源上传者专辑
Log4j2实现不同线程不同级别日志输出到不同的文件中
Practical Data Analysis
数据结构:图
课程资源热门标签
VIP会员动态
下载频道积分规则调整V1710.18
CSDN下载频道积分调整公告V1710.17
开通VIP,海量IT资源任性下载
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
CSDN&VIP年卡&4000万程序员的必选
为了良好体验,不建议使用迅雷下载
后缀表达式求值的源代码
会员到期时间:
剩余下载个数:
剩余C币:593
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
(仅够下载10个资源)
全站300个资源免积分下载
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
全站300个资源免积分下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
全站300个资源免积分下载
为了良好体验,不建议使用迅雷下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
iluxiaoxiaoniao
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
后缀表达式求值的源代码 上传我的文档
 下载
 收藏
毕业于医学院校,在医院工作,有相对丰富的护理经验
 下载此文档
数据结构 计算后缀表达式
下载积分:1500
内容提示:数据结构 计算后缀表达式
文档格式:DOC|
浏览次数:36|
上传日期: 09:23:36|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1500 积分
下载此文档
该用户还上传了这些文档
数据结构 计算后缀表达式
关注微信公众号[数据结构] 表达式求值(转化为后缀表达式再求值或直接求值) - CSDN博客
[数据结构] 表达式求值(转化为后缀表达式再求值或直接求值)
两种情况:
1. 根据输入的算数表达式,如(56-20) /(4+2), 先转化为后缀表达式(逆波兰式)56#20#-4#2#+/ &因为输入的数字有多位数的(56),所以数之间用#隔开,然后根据后缀表达式求值。
2.根据输入的算数表达式,直接进行求值。
对于情况1:
转化为后缀表达式时用到了一个符号栈,把后缀表达式存放到数组postExp中,根据后缀表达式求值时用到了一个运算数栈,运算完后,栈顶即为所求。
完整代码如下:
#include &iostream&
#include &stdio.h&
#include &string.h&
#include &algorithm&
#include &stack&
#include &queue&
const int maxOp = 7;//符号的总数
//设定运算符优先级
}lpri[] = {{'=', 0}, {'(', 1}, {'*', 5}, {'/', 5}, {'+', 3}, {'-', 3}, {')', 6}},
rpri[] = {{'=', 0}, {'(', 6}, {'*', 4}, {'/', 4}, {'+', 2}, {'-', 2}, {')', 1}};
int LeftPri(char op)//求左运算符op的优先级
for(int i = 0; i & maxOp; ++ i)
if(lpri[i].ch == op)
return lpri[i].
int RightPri(char op)//求右运算符op的优先级
for(int i = 0; i & maxOp; ++ i)
if(rpri[i].ch == op)
return rpri[i].
bool IsOp(char ch)//判断符号ch是否为运算符
if(ch == '(' || ch == ')' || ch == '+' || ch == '-' || ch == '*' || ch == '/')
int Precede(char op1, char op2) //op1和op2运算符优先级的比较结果
int lPri = LeftPri(op1);
int rPri = RightPri(op2);
if(lPri == rPri)
else if(lPri & rPri)
return -1;
void TransToPostExp(char* exp, char postExp[]) //将算数表达式exp转换成后缀表达式
stack&char&opS//运算符栈
opStack.push('=');// =入栈,其优先级最低
int i = 0;//后缀表达式字符指针
while(*exp != '\0')
if(!IsOp(*exp)) //如果不是运算符
while(*exp &= '0' && *exp &= '9')//是数字
postExp[i ++] = *
postExp[i ++] = '#'; //用'#'表示一个数值串的结束,比如456#
int cmpPri = Precede(opStack.top(), *exp);
if(cmpPri == 0) //左右运算符优先级相等,也就是()这种情况
opStack.pop();// '('退栈
else if(cmpPri == -1) //栈顶运算符优先级低
opStack.push(*exp);//入栈,符号栈栈顶始终是优先级最高的
//栈顶运算符优先级高
while(Precede(opStack.top(), *exp) == 1)//不断退栈
postExp[i ++] = opStack.top();
opStack.pop();
//opStack.push(*exp);
// exp ++;
一定要注意!不能这样写,因为有可能当前字符是')'
while(opStack.top() != '=')//exp扫描完毕,退栈到' = '为止
postExp[i ++] = opStack.top();
opStack.pop();
postExp[i] = '\0';//postExp表达式添加结束标识
void GetTwoFromStack(stack&double&& numStack, double& a, double& b)//从运算数栈中获取两个数,栈顶和次栈顶
a = numStack.top();
numStack.pop();
b = numStack.top();
numStack.pop();
float CalFromPostExp(char* postExp)//计算后缀表达式的值
stack&double& numS//运算数栈
while(*postExp != '\0')
switch(*postExp)
case '#':
case '+':
GetTwoFromStack(numStack, a, b);//获取运算数栈的两个数
numStack.push(b + a);//进行运算,再压入运算数中
case '-':
GetTwoFromStack(numStack, a, b);
numStack.push(b - a);
case '*':
GetTwoFromStack(numStack, a, b);
numStack.push(b * a);
case '/':
GetTwoFromStack(numStack, a, b);
if(a != 0)
numStack.push(b / a);
cout && &除0错误! & &&
default: //处理数字字符
int n = 0;
while(*postExp &= '0' && *postExp &= '9')
n = n * 10 + (*postExp - '0');
postExp ++;
numStack.push(n);
postExp ++; //继续处理字符
return numStack.top();
char exp[50];
char postExp[50];
int main()
while(cin && exp)
cout && &中缀表达式为: & && exp &&
TransToPostExp(exp, postExp);//将算数表达式转化为后缀表达式,比如输入(56-20)/(4+2) ,输出 56#20#-4#2#+/
cout && &后缀表达式为: & && postExp &&
cout && &表达式的值为: & &&CalFromPostExp(postExp) && endl &&
及其容易出现错误的地方为void TransToPostExp(char* exp, char postExp[]) //将算数表达式exp转换成后缀表达式 & 这个函数中:
//栈顶运算符优先级高
while(Precede(opStack.top(), *exp) == 1)//不断退栈
postExp[i ++] = opStack.top();
opStack.pop();
//opStack.push(*exp);
// exp ++;
一定要注意!不能这样写,因为有可能当前字符是')'
一定要注意如果当前字符时')'时,它的右优先级是最低的,因为除了'('外的其它符号 + - * / 遇到它都得退出符号栈
不要把')'加入到符号栈中,opStack.push(*exp);
也不要直接忽略')'而继续扫描下一个字符,因为此时栈顶可能时'(',需要进行下一轮的比较,把'('出栈, 所以不能写 exp ++.
也就是说 这里需要特别考虑 当前字符是 ')'的情况
对于情况2:
用到了两个栈,符号栈和运算数栈,对输入的运算数表达式边扫描边求值。
完整代码(来来回回改了N多遍, &支持 ((((3+2))))这种情况) :
#include &iostream&
#include &stdio.h&
#include &string.h&
#include &algorithm&
#include &stack&
#include &queue&
const int maxOp = 7;//符号的总数
//设定运算符优先级
}lpri[] = {{'=', 0}, {'(', 1}, {'*', 5}, {'/', 5}, {'+', 3}, {'-', 3}, {')', 6}},
rpri[] = {{'=', 0}, {'(', 6}, {'*', 4}, {'/', 4}, {'+', 2}, {'-', 2}, {')', 1}};
int LeftPri(char op)//求左运算符op的优先级
for(int i = 0; i & maxOp; ++ i)
if(lpri[i].ch == op)
return lpri[i].
int RightPri(char op)//求右运算符op的优先级
for(int i = 0; i & maxOp; ++ i)
if(rpri[i].ch == op)
return rpri[i].
bool IsOp(char ch)//判断符号ch是否为运算符
if(ch == '(' || ch == ')' || ch == '+' || ch == '-' || ch == '*' || ch == '/')
int Precede(char op1, char op2) //op1和op2运算符优先级的比较结果
int lPri = LeftPri(op1);
int rPri = RightPri(op2);
if(lPri == rPri)
else if(lPri & rPri)
return -1;
void GetTwoFromStack(stack&double&& numStack, double& a, double& b)//从运算数栈中获取两个数,栈顶和次栈顶
a = numStack.top();
numStack.pop();
b = numStack.top();
numStack.pop();
double CalFromNumStack(stack&char&& opStack, stack&double&& numStack)
//从符号栈提取栈顶符号,利用运算数栈的栈顶和次栈顶进行计算,并把结果压入运算数栈中
    double a,
    char op = opStack.top();//运算符提取
    opStack.pop();//退栈
    GetTwoFromStack(numStack, a, b);//a,b为栈顶和次栈顶
    switch(op)
    {
    case '+':
        numStack.push(b + a);
       
    case '-':
        numStack.push(b - a);
       
    case '*':
        numStack.push(b * a);
       
    case '/':
        numStack.push((b / a));
       
    }//switch
float CalFromExp(char* exp)
stack&char& opS//符号栈
opStack.push('=');//'='优先级最低
stack&double& numS//运算数栈
while(*exp != '\0')
if(!IsOp(*exp)) //如果不是运算符
int n = 0;//提取数字
while(*exp &= '0' && *exp &= '9')
n = n * 10 + (*exp - '0');
numStack.push(n);//把提取出来的数压入运算数栈
int cmpPri = Precede(opStack.top(), *exp);
if(cmpPri == 0)
// ')'遇到栈顶'('
opStack.pop();
else if(cmpPri == -1)// 栈顶运算符优先级小
opStack.push(*exp);
//栈顶运算符优先级大
while(Precede(opStack.top(), *exp) == 1)
CalFromNumStack(opStack,numStack);
// exp ++;//扫描下一个字符
}//当前字符是运算符
while(opStack.top() != '=')//千万不能忘了这个!!
CalFromNumStack(opStack,numStack);
return numStack.top();
char exp[50];
char postExp[50];
int main()
while(cin && exp)
cout && &中缀表达式为: & && exp &&
//TransToPostExp(exp, postExp);//将算数表达式转化为后缀表达式,比如输入(56-20)/(4+2) ,输出 56#20#-4#2#+/
// cout && &后缀表达式为: & && postExp &&
cout && &表达式的值为: & &&CalFromExp(exp) && endl &&
及其容易出现错误的地方和情况1一样。
本文已收录于以下专栏:
相关文章推荐
萌新常用的都在这了,本萌新的模板集。
时间复杂度(渐近时间复杂度的严格定义,NP问题,时间复杂度的分析方法,主定理)
排序算法(平方排序算法的应用,Shell排序,快速排序,归并排序,时间复杂度下界,三种线性时间排  序,外部...
参考:《剑指offer》纪念版
情况1.:给出树的前序序列和中序序列,输出后序序列
情况2 :给出树的后序序列和中序序列,输出前序序列
解决方法:根据所给出的两个序列,构造出(重建)二叉...
课程设计————学生管理系统二(包含历代思路和代码)
一个算术表达式,含有数字(为简化处理,数字只有一位),运算符:+、-、*,以及括号,求表达式的值。
 给出的表达式是一般我们见到的中缀表达式,即运算符位于操作数之间。如果把中缀表达式转化为后...
Android小项目
这是我首个使用java写的app,也在学习郭霖老师的第一行代码和李刚老师的疯狂java讲义之时,进行的练习之作,刚刚学习java和android,有些地方可能并没...
表达式求值的思路可以是直接处理中缀表达式,也可以采用后缀表达式进行转换求值,这篇文章将按照以下思路:
优先级的概念
-&什么是中缀后缀表达式
-&后缀表达式的优点
-&中缀表达式如何转...
【案情简介】
肇先生是一名退休干部,早年丧妻。几年前,经人介绍与黄女士相识,为了两人日后共同生活,肇先生用自己全部的积蓄买了一套100平米的大房子并办理了登记备案,随后两人办理了结婚登记,搬进了新家...
http://www.nowamagic.net/algorithm/algorithm_PointInT
给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内。这是游戏设计中一个常见...
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 算术表达式的后缀式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信