表达式计算:中辍转后辍,一元操作符运算

老邓 2010-04-12 09:30:10
中缀转后缀需要处理的有:
1. 操作数,操作符的提取
2. 括号等关系到运算符优先级的符号
3. 一元操作符(如 +(正), -(负)) 等
4. 操作符和操作数的匹配,括号的匹配

基本思路如下:
用一个链表 std::list<ExpressionToken> 储存将要生成的后缀表达式
用一个栈 std::stack<OperatorType> 储存操作符
判断当前节点,如果是操作数,直接加入后缀表达式中,如果是操作符,则比较前一个操作符和当前操作符的优先级,如果前一个操作符优先级较高,则将前一个操作符加入后缀表达式中,否则将操作符压入操作符栈,如果遇到反括号 ')', 则在操作符栈中反向搜索,直到遇到匹配的正括号为止,将中间的操作符依次加到后缀表达式中。

我的问题:如何处理一元操作符,包括 + - ! ?
比如表达式:(-2 - 1) + !((+3 + !0) - -2) || 1
按上面的思路,如何生成后缀表达式?
...全文
2012 95 打赏 收藏 转发到动态 举报
写回复
用AI写文章
95 条回复
切换为时间正序
请发表友善的回复…
发表回复
pcliuguangtao 2011-04-15
  • 打赏
  • 举报
回复
呵呵,恩,有不同的方法实现,下面是我的:
http://blog.csdn.net/pcliuguangtao/archive/2011/04/13/6321777.aspx
ollydbg23 2010-12-28
  • 打赏
  • 举报
回复
另外,wanyouzhu 的代码,似乎开头要加入
#include <stdexcept>

否则编译通不过。
ollydbg23 2010-12-28
  • 打赏
  • 举报
回复
另外,我发现 wanyouzhu 的方法,和codeblocks论坛里面的大牛
http://forums.codeblocks.org/index.php/topic,12013.msg84068.html#msg84068
提供的那个template模板写的头文件的方法很像。
ollydbg23 2010-12-28
  • 打赏
  • 举报
回复
wanyouzhu 写的这个算法真是厉害啊,太赞了!我打算试试,呵呵,用用看。

另外,我看到一个简单的C实现,在这:

http://en.literateprograms.org/Shunting_yard_algorithm_%28C%29
ollydbg23 2010-04-16
  • 打赏
  • 举报
回复
@Loaden
昨天Codeblocks论坛里面的大牛给出了他自己写的一个代码,全部是模板实现的。我看不懂,你可以去看看
Re: Is this something we can solve with the improved CC
老邓 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 87 楼 ollydbg23 的回复:]

@Loaden
昨天Codeblocks论坛里面的大牛给出了他自己写的一个代码,全部是模板实现的。我看不懂,你可以去看看
Re: Is this something we can solve with the improved CC
[/Quote]
下载了,不过没细看。
而且,我已经按自己的预想实现了。经反复测试,是成功的!
I_CAN_FLY_Y 2010-04-15
  • 打赏
  • 举报
回复
看不懂,CAN NOT UNDERSTAND
走好每一步 2010-04-14
  • 打赏
  • 举报
回复
我看过一本算法书,用的是栈实现,我当时看的时候,直接傻掉!犀利!
不过当中没一元操作符。
cj413304161 2010-04-14
  • 打赏
  • 举报
回复
你总是最棒的
cj413304161 2010-04-14
  • 打赏
  • 举报
回复
不错,好好加油,支持
jiangseraph 2010-04-14
  • 打赏
  • 举报
回复
Mark 学习
qj737 2010-04-14
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!!!!!!!!!!
yzh090227 2010-04-13
  • 打赏
  • 举报
回复
这代码也太长了,看不懂。
xhp7185 2010-04-13
  • 打赏
  • 举报
回复
看分来的。。。
贪食蛇男 2010-04-13
  • 打赏
  • 举报
回复
大神.
我来JF的
wuyi8808 2010-04-13
  • 打赏
  • 举报
回复
mark
caidonghen 2010-04-13
  • 打赏
  • 举报
回复
抢个分。
alinchuan 2010-04-13
  • 打赏
  • 举报
回复
楼上的几个台强悍了! 代码都出来了!
这里我就简单说一下算法的数据结构吧:
比较 - + * ! 等运算符 课先给它们定一个权值weight 优先级大的weight大
如:* weight=2 > + weight=1
然后把数和运算符一起放到排序二叉树中 提取时按中序遍历
之后就是 计算了 这里我就不说了 相信你会 !
老邓 2010-04-13
  • 打赏
  • 举报
回复
非常感谢各位!特别感谢 飞雪 wanyouzhu !!
w121640121 2010-04-13
  • 打赏
  • 举报
回复
我觉得在两个+,-之间可以填0,用个特殊字符表示,出栈时将此字符忽略。
入栈时设个标识FLAG,连续压入两个+,-或者+,-前没有数字就添个0。
至于一元操作符,还和我刚才说的一样,置一个最高的优先级,出栈另设规则。
((-2 - 1) + !((+3 + !0) - -2))|| 1
就变成(零 - 2 - 1)+ !((零 + 3 + !0) - 零 - 2) || 1
波兰式好像是 2零-1-零3+0!+零-2-!+1||
去掉零就是 2-1-3+0!+-2-!+1||
加载更多回复(70)
The C programming Language 第二版英文版 內容列表 Table of Contents Preface.......................................................... Preface to the first edition..................................... Introduction..................................................... Chapter 1 - A Tutorial Introduction.............................. 1.1 Getting Started................................ 1.2 Variables and Arithmetic Expressions........... 1.3 The for statement.............................. 1.4 Symbolic Constants............................. 1.5 Character Input and Output..................... 1.5.1 File Copying.......................... 1.5.2 Character Counting.................... 1.5.3 Line Counting......................... 1.5.4 Word Counting......................... 1.6 Arrays......................................... 1.7 Functions...................................... 1.8 Arguments - Call by Value...................... 1.9 Character Arrays............................... 1.10 External Variables and Scope.................. Chapter 2 - Types, Operators and Expressions..................... 2.1 Variable Names................................. 2.2 Data Types and Sizes........................... 2.3 Constants...................................... 2.4 Declarations................................... 2.5 Arithmetic Operators........................... 2.6 Relational and Logical Operators............... 2.7 Type Conversions............................... 2.8 Increment and Decrement Operators.............. 2.9 Bitwise Operators.............................. 2.10 Assignment Operators and Expressions.......... 2.11 Conditional Expressions....................... 2.12 Precedence and Order of Evaluation............ Chapter 3 - Control Flow......................................... 3.1 Statements and Blocks.......................... 3.2 If-Else........................................ 3.3 Else-If........................................ 3.4 Switch......................................... 3.5 Loops - While and For.......................... 3.6 Loops - Do-While............................... 3.7 Break and Continue............................. 3.8 Goto and labels................................ Chapter 4 - Functions and Program Structure...................... 4.1 Basics of Functions............................ 4.2 Functions Returning Non-integers............... 4.3 External Variables............................. 4.4 Scope Rules.................................... 4.5 Header Files................................... 4.6 Static Variables................................ 4.7 Register Variables.............................. 4.8 Block Structure................................. 4.9 Initialization.................................. 4.10 Recursion...................................... 4.11 The C Preprocessor............................. 4.11.1 File Inclusion........................ 4.11.2 Macro Substitution.................... 4.11.3 Conditional Inclusion................. Chapter 5 - Pointers and Arrays.................................. 5.1 Pointers and Addresses......................... 5.2 Pointers and Function Arguments................ 5.3 Pointers and Arrays............................ 5.4 Address Arithmetic............................. 5.5 Character Pointers and Functions............... 5.6 Pointer Arrays; Pointers to Pointers........... 5.7 Multi-dimensional Arrays....................... 5.8 Initialization of Pointer Arrays............... 5.9 Pointers vs. Multi-dimensional Arrays.......... 5.10 Command-line Arguments........................ 5.11 Pointers to Functions......................... 5.12 Complicated Declarations...................... Chapter 6 - Structures........................................... 6.1 Basics of Structures........................... 6.2 Structures and Functions....................... 6.3 Arrays of Structures........................... 6.4 Pointers to Structures......................... 6.5 Self-referential Structures.................... 6.6 Table Lookup................................... 6.7 Typedef........................................ 6.8 Unions......................................... 6.9 Bit-fields..................................... Chapter 7 - Input and Output..................................... 7.1 Standard Input and Output....................... 7.2 Formatted Output - printf....................... 7.3 Variable-length Argument Lists.................. 7.4 Formatted Input - Scanf......................... 7.5 File Access..................................... 7.6 Error Handling - Stderr and Exit................ 7.7 Line Input and Output........................... 7.8 Miscellaneous Functions......................... 7.8.1 String Operations...................... 7.8.2 Character Class Testing and Conversion. 7.8.3 Ungetc................................. 7.8.4 Command Execution...................... 7.8.5 Storage Management..................... 7.8.6 Mathematical Functions................. 7.8.7 Random Number generation............... Chapter 8 - The UNIX System Interface............................ 8.1 File Descriptors............................... 8.2 Low Level I/O - Read and Write................. 8.3 Open, Creat, Close, Unlink..................... 8.4 Random Access - Lseek.......................... 8.5 Example - An implementation of Fopen and Getc.. 8.6 Example - Listing Directories.................. 8.7 Example - A Storage Allocator.................. Appendix A - Reference Manual.................................... A.1 Introduction................................... A.2 Lexical Conventions............................ A.2.1 Tokens................................ A.2.2 Comments.............................. A.2.3 Identifiers........................... A.2.4 Keywords.............................. A.2.5 Constants............................. A.2.6 String Literals....................... A.3 Syntax Notation................................ A.4 Meaning of Identifiers......................... A.4.1 Storage Class......................... A.4.2 Basic Types........................... A.4.3 Derived types......................... A.4.4 Type Qualifiers....................... A.5 Objects and Lvalues............................ A.6 Conversions.................................... A.6.1 Integral Promotion.................... A.6.2 Integral Conversions.................. A.6.3 Integer and Floating.................. A.6.4 Floating Types........................ A.6.5 Arithmetic Conversions................ A.6.6 Pointers and Integers................. A.6.7 Void.................................. A.6.8 Pointers to Void...................... A.7 Expressions.................................... A.7.1 Pointer Conversion.................... A.7.2 Primary Expressions................... A.7.3 Postfix Expressions................... A.7.4 Unary Operators....................... A.7.5 Casts................................. A.7.6 Multiplicative Operators.............. A.7.7 Additive Operators.................... A.7.8 Shift Operators....................... A.7.9 Relational Operators.................. A.7.10 Equality Operators................... A.7.11 Bitwise AND Operator................. A.7.12 Bitwise Exclusive OR Operator........ A.7.13 Bitwise Inclusive OR Operator........ A.7.14 Logical AND Operator................. A.7.15 Logical OR Operator.................. A.7.16 Conditional Operator................. A.7.17 Assignment Expressions............... A.7.18 Comma Operator.......................... A.7.19 Constant Expressions.................... A.8 Declarations..................................... A.8.1 Storage Class Specifiers................. A.8.2 Type Specifiers.......................... A.8.3 Structure and Union Declarations......... A.8.4 Enumerations............................. A.8.5 Declarators.............................. A.8.6 Meaning of Declarators................... A.8.7 Initialization........................... A.8.8 Type names............................... A.8.9 Typedef.................................. A.8.10 Type Equivalence........................ A.9 Statements....................................... A.9.1 Labeled Statements....................... A.9.2 Expression Statement..................... A.9.3 Compound Statement....................... A.9.4 Selection Statements..................... A.9.5 Iteration Statements..................... A.9.6 Jump statements.......................... A.10 External Declarations........................... A.10.1 Function Definitions.................... A.10.2 External Declarations................... A.11 Scope and Linkage............................... A.11.1 Lexical Scope........................... A.11.2 Linkage................................. A.12 Preprocessing................................... A.12.1 Trigraph Sequences...................... A.12.2 Line Splicing........................... A.12.3 Macro Definition and Expansion.......... A.12.4 File Inclusion.......................... A.12.5 Conditional Compilation................. A.12.6 Line Control............................ A.12.7 Error Generation........................ A.12.8 Pragmas................................. A.12.9 Null directive.......................... A.12.10 Predefined names....................... A.13 Grammar......................................... Appendix B - Standard Library.................................... B.1.1 File Operations................................ B.1.2 Formatted Output......................... B.1.3 Formatted Input.......................... B.1.4 Character Input and Output Functions..... B.1.5 Direct Input and Output Functions........ B.1.6 File Positioning Functions............... B.1.7 Error Functions.......................... B.2 Character Class Tests: ................. B.3 String Functions: ..................... B.4 Mathematical Functions: ................. B.5 Utility Functions: ....................

65,020

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧