├── README.md ├── pro1.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── el1ven.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── el1ven.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── pro1.xcscheme │ └── xcschememanagement.plist ├── pro1 ├── main.cpp └── pro1.1 └── result.png /README.md: -------------------------------------------------------------------------------- 1 | 中缀表达式转换为后缀表达式 2 | 3 | http://blog.csdn.net/sgbfblog/article/details/8001651 4 | 5 | 一、后缀表达式求值 6 | 后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储。假定待求值的后缀表达式为:6 5 2 3 + 8 * + 3 + *,则其求值过程如下: 7 | 1)遍历表达式,遇到的数字首先放入栈中,此时栈如下所示: 8 | 9 | 2)接着读到“+”,则弹出3和2,执行3+2,计算结果等于5,并将5压入到栈中。 10 | 11 | 3)读到8,将其直接放入栈中。 12 | 13 | 4)读到“*”,弹出8和5,执行8*5,并将结果40压入栈中。而后过程类似,读到“+”,将40和5弹出,将40+5的结果45压入栈...以此类推。最后求的值288。 14 | 15 | 16 | 二、中缀表达式转后缀表达式 17 | 2.1)规则 18 | 中缀表达式a + b*c + (d * e + f) * g,其转换成后缀表达式则为a b c * + d e * f + g * +。 19 | 转换过程需要用到栈,具体过程如下: 20 | 1)如果遇到操作数,我们就直接将其输出。 21 | 2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。 22 | 3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。 23 | 4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。 24 | 5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。 25 | 26 | 2.2)实例 27 | 规则很多,还是用实例比较容易说清楚整个过程。以上面的转换为例,输入为a + b * c + (d * e + f)*g,处理过程如下: 28 | 1)首先读到a,直接输出。 29 | 2)读到“+”,将其放入到栈中。 30 | 3)读到b,直接输出。 31 | 此时栈和输出的情况如下: 32 | 33 | 34 | 4)读到“*”,因为栈顶元素"+"优先级比" * " 低,所以将" * "直接压入栈中。 35 | 5)读到c,直接输出。 36 | 此时栈和输出情况如下: 37 | 38 | 39 | 6)读到" + ",因为栈顶元素" * "的优先级比它高,所以弹出" * "并输出, 同理,栈中下一个元素" + "优先级与读到的操作符" + "一样,所以也要弹出并输出。然后再将读到的" + "压入栈中。 40 | 此时栈和输出情况如下: 41 | 42 | 43 | 7)下一个读到的为"(",它优先级最高,所以直接放入到栈中。 44 | 8)读到d,将其直接输出。 45 | 此时栈和输出情况如下: 46 | 47 | 48 | 9)读到" * ",由于只有遇到" ) "的时候左括号"("才会弹出,所以" * "直接压入栈中。 49 | 10)读到e,直接输出。 50 | 此时栈和输出情况如下: 51 | 52 | 53 | 11)读到" + ",弹出" * "并输出,然后将"+"压入栈中。 54 | 12)读到f,直接输出。 55 | 此时栈和输出情况: 56 | 57 | 58 | 13)接下来读到“)”,则直接将栈中元素弹出并输出直到遇到"("为止。这里右括号前只有一个操作符"+"被弹出并输出。 59 | 60 | 61 | 14)读到" * ",压入栈中。读到g,直接输出。 62 | 63 | 64 | 15)此时输入数据已经读到末尾,栈中还有两个操作符“*”和" + ",直接弹出并输出。 65 | 66 | 至此整个转换过程完成。程序实现代码后续再补充了。 67 | 68 | 2.3)转换的另一种方法 69 | 1)先按照运算符的优先级对中缀表达式加括号,变成( ( a+(b*c) ) + ( ((d*e)+f) *g ) ) 70 | 2)将运算符移到括号的后面,变成((a(bc)*)+(((de)*f)+g)*)+ 71 | 3)去掉括号,得到abc*+de*f+g*+ -------------------------------------------------------------------------------- /pro1.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D93A21471941614000577967 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D93A21461941614000577967 /* main.cpp */; }; 11 | D93A21491941614000577967 /* pro1.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = D93A21481941614000577967 /* pro1.1 */; }; 12 | /* End PBXBuildFile section */ 13 | 14 | /* Begin PBXCopyFilesBuildPhase section */ 15 | D93A21411941614000577967 /* CopyFiles */ = { 16 | isa = PBXCopyFilesBuildPhase; 17 | buildActionMask = 2147483647; 18 | dstPath = /usr/share/man/man1/; 19 | dstSubfolderSpec = 0; 20 | files = ( 21 | D93A21491941614000577967 /* pro1.1 in CopyFiles */, 22 | ); 23 | runOnlyForDeploymentPostprocessing = 1; 24 | }; 25 | /* End PBXCopyFilesBuildPhase section */ 26 | 27 | /* Begin PBXFileReference section */ 28 | D93A21431941614000577967 /* pro1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = pro1; sourceTree = BUILT_PRODUCTS_DIR; }; 29 | D93A21461941614000577967 /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; 30 | D93A21481941614000577967 /* pro1.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = pro1.1; sourceTree = ""; }; 31 | /* End PBXFileReference section */ 32 | 33 | /* Begin PBXFrameworksBuildPhase section */ 34 | D93A21401941614000577967 /* Frameworks */ = { 35 | isa = PBXFrameworksBuildPhase; 36 | buildActionMask = 2147483647; 37 | files = ( 38 | ); 39 | runOnlyForDeploymentPostprocessing = 0; 40 | }; 41 | /* End PBXFrameworksBuildPhase section */ 42 | 43 | /* Begin PBXGroup section */ 44 | D93A213A1941614000577967 = { 45 | isa = PBXGroup; 46 | children = ( 47 | D93A21451941614000577967 /* pro1 */, 48 | D93A21441941614000577967 /* Products */, 49 | ); 50 | sourceTree = ""; 51 | }; 52 | D93A21441941614000577967 /* Products */ = { 53 | isa = PBXGroup; 54 | children = ( 55 | D93A21431941614000577967 /* pro1 */, 56 | ); 57 | name = Products; 58 | sourceTree = ""; 59 | }; 60 | D93A21451941614000577967 /* pro1 */ = { 61 | isa = PBXGroup; 62 | children = ( 63 | D93A21461941614000577967 /* main.cpp */, 64 | D93A21481941614000577967 /* pro1.1 */, 65 | ); 66 | path = pro1; 67 | sourceTree = ""; 68 | }; 69 | /* End PBXGroup section */ 70 | 71 | /* Begin PBXNativeTarget section */ 72 | D93A21421941614000577967 /* pro1 */ = { 73 | isa = PBXNativeTarget; 74 | buildConfigurationList = D93A214C1941614000577967 /* Build configuration list for PBXNativeTarget "pro1" */; 75 | buildPhases = ( 76 | D93A213F1941614000577967 /* Sources */, 77 | D93A21401941614000577967 /* Frameworks */, 78 | D93A21411941614000577967 /* CopyFiles */, 79 | ); 80 | buildRules = ( 81 | ); 82 | dependencies = ( 83 | ); 84 | name = pro1; 85 | productName = pro1; 86 | productReference = D93A21431941614000577967 /* pro1 */; 87 | productType = "com.apple.product-type.tool"; 88 | }; 89 | /* End PBXNativeTarget section */ 90 | 91 | /* Begin PBXProject section */ 92 | D93A213B1941614000577967 /* Project object */ = { 93 | isa = PBXProject; 94 | attributes = { 95 | LastUpgradeCheck = 0510; 96 | ORGANIZATIONNAME = el1ven; 97 | }; 98 | buildConfigurationList = D93A213E1941614000577967 /* Build configuration list for PBXProject "pro1" */; 99 | compatibilityVersion = "Xcode 3.2"; 100 | developmentRegion = English; 101 | hasScannedForEncodings = 0; 102 | knownRegions = ( 103 | en, 104 | ); 105 | mainGroup = D93A213A1941614000577967; 106 | productRefGroup = D93A21441941614000577967 /* Products */; 107 | projectDirPath = ""; 108 | projectRoot = ""; 109 | targets = ( 110 | D93A21421941614000577967 /* pro1 */, 111 | ); 112 | }; 113 | /* End PBXProject section */ 114 | 115 | /* Begin PBXSourcesBuildPhase section */ 116 | D93A213F1941614000577967 /* Sources */ = { 117 | isa = PBXSourcesBuildPhase; 118 | buildActionMask = 2147483647; 119 | files = ( 120 | D93A21471941614000577967 /* main.cpp in Sources */, 121 | ); 122 | runOnlyForDeploymentPostprocessing = 0; 123 | }; 124 | /* End PBXSourcesBuildPhase section */ 125 | 126 | /* Begin XCBuildConfiguration section */ 127 | D93A214A1941614000577967 /* Debug */ = { 128 | isa = XCBuildConfiguration; 129 | buildSettings = { 130 | ALWAYS_SEARCH_USER_PATHS = NO; 131 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 132 | CLANG_CXX_LIBRARY = "libc++"; 133 | CLANG_ENABLE_MODULES = YES; 134 | CLANG_ENABLE_OBJC_ARC = YES; 135 | CLANG_WARN_BOOL_CONVERSION = YES; 136 | CLANG_WARN_CONSTANT_CONVERSION = YES; 137 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 138 | CLANG_WARN_EMPTY_BODY = YES; 139 | CLANG_WARN_ENUM_CONVERSION = YES; 140 | CLANG_WARN_INT_CONVERSION = YES; 141 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 142 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 143 | COPY_PHASE_STRIP = NO; 144 | GCC_C_LANGUAGE_STANDARD = gnu99; 145 | GCC_DYNAMIC_NO_PIC = NO; 146 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 147 | GCC_OPTIMIZATION_LEVEL = 0; 148 | GCC_PREPROCESSOR_DEFINITIONS = ( 149 | "DEBUG=1", 150 | "$(inherited)", 151 | ); 152 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 153 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 154 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 155 | GCC_WARN_UNDECLARED_SELECTOR = YES; 156 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 157 | GCC_WARN_UNUSED_FUNCTION = YES; 158 | GCC_WARN_UNUSED_VARIABLE = YES; 159 | MACOSX_DEPLOYMENT_TARGET = 10.9; 160 | ONLY_ACTIVE_ARCH = YES; 161 | SDKROOT = macosx; 162 | }; 163 | name = Debug; 164 | }; 165 | D93A214B1941614000577967 /* Release */ = { 166 | isa = XCBuildConfiguration; 167 | buildSettings = { 168 | ALWAYS_SEARCH_USER_PATHS = NO; 169 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 170 | CLANG_CXX_LIBRARY = "libc++"; 171 | CLANG_ENABLE_MODULES = YES; 172 | CLANG_ENABLE_OBJC_ARC = YES; 173 | CLANG_WARN_BOOL_CONVERSION = YES; 174 | CLANG_WARN_CONSTANT_CONVERSION = YES; 175 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 176 | CLANG_WARN_EMPTY_BODY = YES; 177 | CLANG_WARN_ENUM_CONVERSION = YES; 178 | CLANG_WARN_INT_CONVERSION = YES; 179 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 180 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 181 | COPY_PHASE_STRIP = YES; 182 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 183 | ENABLE_NS_ASSERTIONS = NO; 184 | GCC_C_LANGUAGE_STANDARD = gnu99; 185 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 186 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 187 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 188 | GCC_WARN_UNDECLARED_SELECTOR = YES; 189 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 190 | GCC_WARN_UNUSED_FUNCTION = YES; 191 | GCC_WARN_UNUSED_VARIABLE = YES; 192 | MACOSX_DEPLOYMENT_TARGET = 10.9; 193 | SDKROOT = macosx; 194 | }; 195 | name = Release; 196 | }; 197 | D93A214D1941614000577967 /* Debug */ = { 198 | isa = XCBuildConfiguration; 199 | buildSettings = { 200 | PRODUCT_NAME = "$(TARGET_NAME)"; 201 | }; 202 | name = Debug; 203 | }; 204 | D93A214E1941614000577967 /* Release */ = { 205 | isa = XCBuildConfiguration; 206 | buildSettings = { 207 | PRODUCT_NAME = "$(TARGET_NAME)"; 208 | }; 209 | name = Release; 210 | }; 211 | /* End XCBuildConfiguration section */ 212 | 213 | /* Begin XCConfigurationList section */ 214 | D93A213E1941614000577967 /* Build configuration list for PBXProject "pro1" */ = { 215 | isa = XCConfigurationList; 216 | buildConfigurations = ( 217 | D93A214A1941614000577967 /* Debug */, 218 | D93A214B1941614000577967 /* Release */, 219 | ); 220 | defaultConfigurationIsVisible = 0; 221 | defaultConfigurationName = Release; 222 | }; 223 | D93A214C1941614000577967 /* Build configuration list for PBXNativeTarget "pro1" */ = { 224 | isa = XCConfigurationList; 225 | buildConfigurations = ( 226 | D93A214D1941614000577967 /* Debug */, 227 | D93A214E1941614000577967 /* Release */, 228 | ); 229 | defaultConfigurationIsVisible = 0; 230 | }; 231 | /* End XCConfigurationList section */ 232 | }; 233 | rootObject = D93A213B1941614000577967 /* Project object */; 234 | } 235 | -------------------------------------------------------------------------------- /pro1.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /pro1.xcodeproj/project.xcworkspace/xcuserdata/el1ven.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el1ven/infixConvertPostfix/9ab07b8b5a4bc32977ddf2649cdcdd2f80d3b282/pro1.xcodeproj/project.xcworkspace/xcuserdata/el1ven.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /pro1.xcodeproj/xcuserdata/el1ven.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /pro1.xcodeproj/xcuserdata/el1ven.xcuserdatad/xcschemes/pro1.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /pro1.xcodeproj/xcuserdata/el1ven.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | pro1.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | D93A21421941614000577967 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /pro1/main.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // main.cpp 3 | // pro1 4 | // 5 | // Created by el1ven on 14-6-6. 6 | // Copyright (c) 2014年 el1ven. All rights reserved. 7 | // 8 | 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | using namespace std; 17 | 18 | //中缀表达式转化为后缀表达式, RSP代表逆波兰表达式 19 | 20 | bool isOptMark(char op){//判断是否为运算符 21 | switch(op){ 22 | case '+': 23 | return 1; 24 | break; 25 | case '-': 26 | return 1; 27 | break; 28 | case '*': 29 | return 1; 30 | break; 31 | case '/': 32 | return 1; 33 | break; 34 | case '(': 35 | return 1; 36 | break; 37 | default: 38 | return 0; 39 | } 40 | } 41 | 42 | int prior(char op){//求运算符优先级 43 | switch (op) { 44 | case '#': 45 | return -1; 46 | break; 47 | case '(': 48 | return 0; 49 | break; 50 | case '+': 51 | case '-': 52 | return 1; 53 | break; 54 | case '*': 55 | case '/': 56 | return 2; 57 | break; 58 | default: 59 | return -1; 60 | } 61 | } 62 | 63 | string convert(string infixExp,string &RSP){//中缀表达式转后缀表达式 64 | 65 | stack stk;//存储操作符栈 66 | 67 | stk.push('#');//必须要有这个末尾识别符号,否则栈为空的话,会报错!!! 68 | 69 | int length = (int)infixExp.length();//获取表达式的长度 70 | for(int i = 0; i < length; i++){ 71 | if(infixExp[i] >= '0' && infixExp[i] <= '9'){ 72 | //读入数字的话,直接输出 73 | RSP += infixExp[i]; 74 | }else if(infixExp[i] == '('){ 75 | //遇到左括号直接入栈 76 | stk.push(infixExp[i]); 77 | }else if(infixExp[i] == ')'){ 78 | //如果遇到右括号的话,就把一直到最近的左括号之间的都弹出来加入RPN中 79 | while(stk.top() != '('){ 80 | RSP += stk.top(); 81 | stk.pop(); 82 | } 83 | stk.pop();//把左括号弹出栈 84 | }else if(isOptMark(infixExp[i])){ 85 | //用空格把数字和运算符分开,这样就可以计算多位数字了 86 | RSP += ' '; 87 | //如果是运算符的话,比较他们的优先级再决定是否入栈 88 | while( prior(infixExp[i]) <= prior(stk.top()) ){ 89 | //如果当前的优先级小于等于栈顶操作符的话,栈顶操作符弹出,加入RSP 90 | RSP += stk.top(); 91 | stk.pop(); 92 | } 93 | //如果当前的优先级大于栈顶操作符的话,入栈 94 | 95 | stk.push(infixExp[i]); 96 | 97 | 98 | } 99 | } 100 | //如果已经扫描到中缀表达式的末尾,就把栈中的操作符都弹出来加入到RSP中 101 | while(!stk.empty()){ 102 | RSP += stk.top(); 103 | stk.pop(); 104 | } 105 | 106 | return RSP; 107 | } 108 | 109 | int readNum(string exp, int &i){ 110 | int result = 0; 111 | while(exp[i] >= '0' && exp[i] <= '9'){ 112 | result = result * 10 + (exp[i] - '0'); 113 | i++; 114 | } 115 | return result; 116 | } 117 | 118 | int calulate(string RSP){//计算后缀表达式(逆波兰表达式)的最终数值 119 | 120 | int i = 0; 121 | stack optNum;//操作数栈 122 | int x1,x2 = 0; 123 | 124 | while(RSP[i] != '#'){//没有遇到结束标志#,即进行表达式的计算 125 | if(RSP[i] >= '0' && RSP[i] <= '9'){ 126 | optNum.push(readNum(RSP, i));//字符串转整数 127 | }else if(RSP[i] == ' '){ 128 | i++; 129 | }else if(RSP[i] == '+'){ 130 | x1 = optNum.top(); 131 | optNum.pop(); 132 | x2 = optNum.top(); 133 | optNum.pop(); 134 | optNum.push(x1+x2); 135 | i++; 136 | }else if(RSP[i] == '-'){ 137 | x1 = optNum.top(); 138 | optNum.pop(); 139 | x2 = optNum.top(); 140 | optNum.pop(); 141 | optNum.push(x2-x1); 142 | i++; 143 | }else if(RSP[i] == '*'){ 144 | x1 = optNum.top(); 145 | optNum.pop(); 146 | x2 = optNum.top(); 147 | optNum.pop(); 148 | optNum.push(x1*x2); 149 | i++; 150 | }else if(RSP[i] == '/'){ 151 | x1 = optNum.top(); 152 | optNum.pop(); 153 | x2 = optNum.top(); 154 | optNum.pop(); 155 | optNum.push(x2/x1); 156 | i++; 157 | } 158 | } 159 | return optNum.top();//返回最终的计算结果 160 | } 161 | 162 | 163 | int main(){ 164 | string infixExp = ""; 165 | while(cin>>infixExp){ 166 | string RSP = ""; 167 | string postFix = convert(infixExp, RSP);//后缀表达式 168 | cout<<"RSP为: "<