通过一道面试题来看 C++ c语言逗号表达式中的表达式求值

键盘输入算术表达式
应用栈的概念设计表达式求值算法
输出表达式求值结果
设两个栈,一个存放操作符OPTR,一个存放操作数OPND,然后将表达式入栈,每次检查新输入的操作符New与当前栈顶的操作符Top的优先级(C语言的比较优先级的库函数我也不清楚,你自己查一下相关教材),如果New的优先级大于Top,则将OPND的元素取出两个,参加New的运算,否则继续录入下一个操作符和操作数,注意两个栈的录入始同步的。OK!
注:相信你讲的算术表达式应该只包括一般的运算,象+,-,*,/等,如果涉及到较复杂的象平方,开方,幂运算等,那我还不会!hehe
如果有更具体的难点,可以发信给我!
其他答案(共3个回答)
fahjkwhr fajfhajk heu aji krwjguihai aklfneiuha aiwjkfna ieign akitje3 kaj lan l...
以下代码,请LZ参考:
int i,j,k;
for(i=0;i&=4;i++)
for(j=0;j&=3-i;j++)
printf("...
关键问题是:
“=”在数学中含义是相等;
而在c语言中他是赋值含义,赋值是有方向性的,右边向左边,更重要是,在程序设计语言中,赋值号“=”左边必须是变量名
你用我visual C++吧,对C语言兼容的,界面清晰简单,而且对以后深入学习C++也有好处
500多年前,意大利的一本算术书中讲述了一种“格子乘法”,后来传入中国,在明朝的《算法统宗》中称为“铺地锦”。你能仿照下面的例子算出“357×46”的积吗?
答: 我来看看你智商怎么样?孩子智商有点低怎么办啊?有提高智商的办法吗?
答: 我可以给你提供个想法,仅供参考咯~!
可以从培训人才和被培训人才的数据比例来说明拉,很有说服力哦~!
祝你好运!
答: 小学科学教案|小学科学教案下载 21世纪教育网
答: 请说的明白点啊,你是要什么性质考试的啊,自考?成考?普通?
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(152)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'中缀表达式求值-用C++模板实现',
blogAbstract:'这个练习比较综合,堆栈,类,模板都有应用。由于书中给的流程比较简单,按照这个流程实现很多细节都没有办法考虑。如,对括号的处理,按照约定,这个符号运算等级最高,但要匹配括号比较困难,因为括号有两个符号组成,要单取到一个括号的一半,如何定义优先级?因此,程序调试了很长时间。\r\n#include&iostream&template&class DataType&struct Node{ &DataT&Node&DataType& *};template&class DataType&class LinkStack{&public:',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:3,
publishTime:7,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}《数据结构》;课程设计说明书;题目学号姓名指导教师日期;算术表达式求值;2012.6;目录;第1章需求分析.................;4.1工程视图.................;第1章需求分析;在计算机中,算术表达式由常量、变量、运算符和括号;算法输入:一个算术表达式,由常量、变量、运算符和;算法输出:表达式运算结果;算法要点:设置运算符栈和运
课程设计说明书
名 指导教师 日
算术表达式求值
第1章 需求分析 ................................................................................................................................ 4 第2章 总体设计 ................................................................................................................................ 4 第3章 抽象数据类型设计 ................................................................................................................ 5 第4章 详细设计 ................................................................................................................................ 6
4.1 工程视图 ................................................................................................................................ 6 4.2 类图视图 ................................................................................................................................ 6 4.3 函数的调用关系 .................................................................................................................... 7 4.4 主程序流程图 ........................................................................................................................ 7 4.5 主要算法的流程图 ................................................................................................................ 8 第5章 测试 ........................................................................................................................................ 9 第6章 总结 ...................................................................................................................................... 10 附录:程序代码 ................................................................................................................................ 11
第1章 需求分析
在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。
算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/。
算法输出:表达式运算结果。
算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。
第2章 总体设计
第3章 抽象数据类型定义
ADT Sqstack
数据对象:D={Ci/Ci∈sqstack,i=1,2,…,n,n≥0} 数据关系:R={&Ci-1,Ci&1 Ci-1,Ci∈D,i=2,…,n} 基本操作:
input(base,top,stacksize)
初始条件:base,top是字符型数据;stacksize是整型数据 操作结果:生成一个算术表达式 Get base(&base,a) 初始条件:若T存在
操作结果:生成一个栈底元素 base Get top(&top,b) 初始条件:若T1存在
操作结果:生成一个栈顶元素 top
三亿文库包含各类专业文献、专业论文、各类资格考试、生活休闲娱乐、高等教育、外语学习资料、行业资料、中学教育、文学作品欣赏、54c语言,c++算数表达式求值等内容。 
 算术表达式求值的运算符优先算法。C语言完整代码_...{ //只能算 0-9 的数之间的运算 Stack...(&OPTR, &x); c++; case '&': // ...  C语言_算数表达式求值_课程设计报告_计算机软件及应用_IT/计算机_专业资料。目 ...c语言,c++算数表达式求值... 18页 免费 C语言课程设计报告(算术... 35页 ...  数​据​结​构​之​算​术​表​达​式​求​值​C...(&输入表达式:\n&); gets(p); printf(&%s=%f\n\n&,string,valuate(p)...  算术表达式求值(c++)数据结构实验_IT/计算机_专业资料。自己做的 ...c语言,c++算数表达式求值... 18页 免费
算术表达式求值-数据结构... 12页...  给出表达式的值; 2) 系统利用 C 语言实现; 3) 独立完成系统的设计、编码和...(存 储算符的 栈) Pop(OPT R,x);c++; (出栈) Pop(OPTR,theta); Pop...  C_C++ 语言中的表达式求值_计算机软件及应用_IT/计算机_专业资料。裘宗燕:C/C++...C/C++ 语言是“基于表达式的语言”,所有计算(包括赋值)都在表达 式里完成。“...  C语言算术表达式和赋值表达式_IT/计算机_专业资料。C语言课件,算术表达式和赋值表达式...c语言,c++算数表达式求值... 18页 免费 C语言_算术表达式求值_代... 暂无...  四则运算表达式求值(栈+二叉树,c++版)_计算机软件及应用_IT/计算机_专业资料。...表达式运算符只有加减乘除, 操作数有整数和小数, 为了能够 存储,采用 C 语言中...  c++表达式求值实现_IT/计算机_专业资料。c++表达式求值实现1:工程结构 2:源代码...表达式求值 C语言 2页 免费 利用栈实现表达式求值 15页 2下载券 数据结构栈实现...好不容易抽出点时间来复习一下数据结构和算法。
看到堆栈部分。有2道题目,第一道是计算C系列括号匹配校验。第二道是计算算数表达式。
第一道题是思路是
跳过 ' &&字符串,/* // 注释以后。
如果发现{, [, ( 那么入栈,发现 },],) 以后出栈,对比是否匹配。
文件检查完以后,堆栈内为空,说明匹配成功。
(ps一句,很多代码是抄的)
第二道题思路
首先把中缀式转换为后缀式。
1)若读入的是操作数,入到输出栈
2)读入的是闭括号,把操作栈中的运算符依次出栈,推入输出栈,一直遇到对应开括号为止,把开括号出栈
3)读入的开括号,进运算符栈
4)读入的是运算符,如果运算符栈优先级高,堆栈运算符出栈,出栈操作一直要进行到栈顶运算符优先级低为止,然后把新的运算符入栈
5)在读入操作符结束扣,把运算符栈中所有剩余运算符依次出栈,放入输出栈
6)计算输出堆表达式的
直接发代码.
先发堆栈的。
#ifndef __ListDemo__List__
#define __ListDemo__List__
#include &iostream&
template &typename T&
class ListNode
ListNode&T&
ListNode(T te, ListNode&T& *L):element(te), next(L){}
ListNode(T te):element(te), next(NULL){}
template &typename T&
class Stack {
ListNode&T&
const int isEmpty()
push(T x);
template &typename T&
const int Stack&T&::isEmpty() const
return head == NULL;
template &typename T&
void Stack&T&::push(T x)
if (head == NULL)
head = new ListNode&T&(x);
ListNode&T& *p = new ListNode&T&(x, head);
template &typename T&
T Stack&T&::pop()
if (head == NULL)
return NULL;
ListNode&T& *p = head-&
T x = head-&
template &typename T&
T Stack&T&::top()
if (head == NULL)
return NULL;
return head-&
#endif /* defined(__ListDemo__List__) */
第一道题:
#ifndef ListDemo_CheckFlag_h
#define ListDemo_CheckFlag_h
#include &iostream&
#include &List.h&
struct Symbol {
class CheckFlag
enum CommonentType { SlashSlash, SlashStar };
// // or /*
Stack&Symbol&
//没有处理的开括号
int NextChar();
//下1个字符
void PutBackChar();
//把当前字符放回输入流
void SkipComment(CommonentType Start);
//跳过 // /*
void SkipQuote(char QuoteType);
//跳过 '' 和 &&
char GetNextSymbol();
//获得下1个括号
void CheckMatch(const Symbol & OpSym, const Symbol & ClSym);
//查开闭括号是否匹配
CheckFlag(istream & Input) : Errors(0), CurrentLine(1), InputStream(Input){}
~CheckFlag() {}
int CheckBalance();
//检查括号是否匹配
int CheckFlag::NextChar()
if (!InputStream.get(Ch))
if (Ch == '\n')
CurrentLine++;
void CheckFlag::PutBackChar()
InputStream.putback(Ch);
if (Ch == '\n')
CurrentLine--;
void CheckFlag::SkipComment(CheckFlag::CommonentType Start)
if (Start == SlashSlash)
while (NextChar() && Ch != '\n')
int State = 0;
while (NextChar())
if (State && Ch == '/')
State = Ch == '*';
Errors ++;
std::cout && &Comment not is unterminated!& && std::
void CheckFlag::SkipQuote(char QuoteType)
while (NextChar())
if (Ch == QuoteType)
else if (Ch == '\n')
//搜索1行结束,没有找到引号
std::cout && &Missing closed quote at line& && CurrentLine && std::
else if (Ch == '\\')
NextChar();
//跳过\转义
char CheckFlag::GetNextSymbol()
while (NextChar())
if (Ch == '/')
if (NextChar())
if (Ch == '*')
SkipComment(SlashStar);
else if (Ch == '/')
SkipComment(SlashSlash);
else if (Ch == '\'' || Ch == '&')
SkipQuote(Ch);
else if (Ch == '{' || Ch == '(' || Ch == '[' ||
Ch == '}' || Ch == ')' || Ch == ']')
return Ch;
int CheckFlag::CheckBalance()
char LastC
Symbol LastSymbol, M
Errors = 0, CurrentLine = 1;
while ((LastChar = GetNextSymbol()))
//得到当前开闭括号
LastSymbol.Token = LastC
LastSymbol.Theline = CurrentL
//当前括号所在行号
switch (LastChar) {
PendingTokens.push(LastSymbol);
if (PendingTokens.isEmpty()) {
std::cout && &Extraneous& && LastChar && &at line& && CurrentLine &&
Match = PendingTokens.pop();
CheckMatch(Match, LastSymbol);
//堆栈还有数据
while (! PendingTokens.isEmpty()) {
Match = PendingTokens.pop();
std::cout && &Un matched& && Match.Token && &at line& && Match.Theline && std::
void CheckFlag::CheckMatch(const Symbol &OpSym, const Symbol &ClSym)
if ((OpSym.Token == '(' && ClSym.Token == ')') ||
(OpSym.Token == '{' && ClSym.Token == '}') ||
(OpSym.Token == '[' && ClSym.Token == ']')
&& &Found open flag: & && OpSym.Token && & on line & && OpSym.Theline
&& & close flag: & && ClSym.Token && &on line & && ClSym.Theline
std::cout && &does not match& && ClSym.Token && &at line& && OpSym.Theline && std::
#ifndef ListDemo_Evaluator_h
#define ListDemo_Evaluator_h
#include &List.h&
#include &string&
class EvalValue
EvalValue(int v, int o):value(v),opType(o){}
class Evaluator
Stack&EvalValue&
Stack&EvalValue&
UNKNOW = 100,
int GetCharOp(char Ch);
bool IsDigit(char Ch);
int Digit(char Ch);
void CheckOp(int op);
void openFlagEval();
//括号处理
void orderOpEval(int op);
//优先级处理
bool checkOpOrder(int TopOp, int op);
//比较优先级
void EvalResult();
//计算结果
string getOpString(int op);
//得到运算符的字符串
int CacluateWithValue(int op, int v1, int v2);
Evaluator(const char *strEval);
virtual ~Evaluator()
{ delete sE delete OpS delete PostFixS }
void Convert();
string Original();
string Converted();
int Caculator();
Evaluator::Evaluator(const char *strEval)
sEval = new string(strEval);
OpStack = new Stack&EvalValue&;
PostFixStack = new Stack&EvalValue&;
void Evaluator::Convert()
int value = 0;
for (int i = 0; i & sEval-&size(); i++)
char Ch = (*sEval)[i];
if (this-&IsDigit(Ch))
value = value * 10 + this-&Digit(Ch);
if (value != 0)
PostFixStack-&push(EvalValue(value, 0));
if (Ch == ' ')
value = 0;
int type = this-&GetCharOp(Ch);
if ( type != UNKNOW)
this-&CheckOp(type);
cout && &error& &&
value = 0;
if (value != 0)
PostFixStack-&push(EvalValue(value, 0));
this-&EvalResult();
string Evaluator::Original()
return *sE
string Evaluator::Converted()
Stack&EvalValue& *tmp = new Stack&EvalValue&();
while (! PostFixStack-&isEmpty() )
tmp-&push(PostFixStack-&pop()) ;
while (! tmp-&isEmpty() )
EvalValue eva = tmp-&pop();
if (eva.opType != 0)
cout && this-&getOpString(eva.opType) && & &;
cout && eva.value && & &;
return string(&&);
int Evaluator::Caculator()
Stack&EvalValue& *reveral = new Stack&EvalValue&();
while (! PostFixStack-&isEmpty() )
reveral-&push(PostFixStack-&pop()) ;
Stack&EvalValue& *tmp = new Stack&EvalValue&();
while (! reveral-&isEmpty() )
EvalValue eva = reveral-&pop();
if (eva.opType != 0)
cout && this-&getOpString(eva.opType) && & &;
int value1 = tmp-&pop().
int value2 = tmp-&pop().
int Vtmp = this-&CacluateWithValue(eva.opType, value1, value2);
tmp-&push(EvalValue(Vtmp, 0));
cout && eva.value && & &;
tmp-&push(eva);
EvalValue eva = tmp-&pop();
return eva.
int Evaluator::GetCharOp(char Ch)
switch (Ch) {
return OPAREN;
return CPAREN;
return EXP;
return MULT;
return DIV;
return PLUS;
return MINUS;
return UNKNOW;
bool Evaluator::IsDigit(char Ch)
if (Ch &= '0' && Ch &= '9')
int Evaluator::Digit(char Ch)
return Ch - '0';
void Evaluator::CheckOp(int op)
switch (op) {
case OPAREN:
OpStack-&push(EvalValue(0, op));
case CPAREN:
//出栈计算
this-&openFlagEval();
case MULT:
case PLUS:
case MINUS:
this-&orderOpEval(op);
void Evaluator::openFlagEval()
EvalValue ev = OpStack-&pop();
while (ev.opType != OPAREN)
PostFixStack-&push(ev);
ev = OpStack-&pop();
void Evaluator::orderOpEval(int op)
if (!OpStack-&isEmpty())
EvalValue ev = OpStack-&top();
//栈顶优先级高
while (this-&checkOpOrder(ev.opType, op))
PostFixStack-&push(OpStack-&pop());
OpStack-&push(EvalValue(0, op));
bool Evaluator::checkOpOrder(int TopOp, int op)
if (TopOp & op)
if (TopOp == EXP ||
// ^悠闲级高
(TopOp == MULT && op & DIV))
// * / 大于 + - 优先级
void Evaluator::EvalResult()
while (!OpStack-&isEmpty())
PostFixStack-&push(OpStack-&pop());
string Evaluator::getOpString(int op)
switch (op) {
case OPAREN:
return &(&;
case CPAREN:
return &)&;
return &^&;
case MULT:
return &*&;
return &/&;
case PLUS:
return &+&;
case MINUS:
return &-&;
return &[error]&;
#include &math.h&
int Evaluator::CacluateWithValue(int op, int v1, int v2)
switch (op) {
return pow(v2, v1);
case MULT:
return v2 * v1;
return v2 / v1;
case PLUS:
return v2 + v1;
case MINUS: return v2 - v1;
本文已收录于以下专栏:
相关文章推荐
为了简化问题,关注算法,本文的讨论基于以下三点:
1. 只考虑 + - * / ( ) 这几个基本运算符,且是二元操作
2. 运算数只考虑 0-9,这10个简单的数,方便从string中取出来
HI API 基础学习   HIGO模块 --Layer(图层)和其Surface
( 14:12:56)
因为电脑配置低,一直用xp系统.就是因为看电影和上网银,才用的ie浏览器.,烦恼于只能装ie8.
好像记得firefox浏览器对兼容ie方面做得挺好,于是下载个新版试了一下,交行网银使用正常,1230...
今天写一下PDF在线阅读的两种方法:
1.  直接用Object读取PDF文件(如果机器上客户端都安装了PDF的话)
aspx代码:
      
     &#...
本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节。
InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档)。本着高效学习的目的,本篇以介绍...
Introduction to Udacity Self-Driving Car Simulator
Udacity recently made its self-driving car simula...
//简单模拟之坏人出列:问题描述:现有n个坏人围坐成一个圆,编号为1——n,现在报道m的坏人出列,然后依次从1开始报数……includeinclud
典型的应用示例:
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:
Markdown和扩展Markdown简洁的语法
代码块高亮
图片链接和...
引用php manual 中的例子:
 * This is an array with some data we want to modify
 *&#1...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 el表达式面试题 的文章

 

随机推荐