[問題] C語言 堆疊 後序 輸入運算元10以上

看板C_and_CPP作者 (Eric)時間11年前 (2012/11/04 20:38), 編輯推噓0(0023)
留言23則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) DEVC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 用堆疊寫後式運算式 但輸入的運算元要求要可以10以上的 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) /* 程式範例: Ch5-3-2.c */ #include <stdio.h> #include <stdlib.h> #include "stack.c" /* 是否是運算子 */ int isOperator(char op) { switch ( op ) { case '+': case '-': case '*': case '/': return 1; /* 是運算子 */ default: return 0; /* 不是運算子 */ } } /* 計算二元運算式的結果 */ int cal(int op,int operand1,int operand2) { switch ( (char) op ) { case '*': return ( operand2 * operand1 ); /* 乘 */ case '/': return ( operand2 / operand1 ); /* 除 */ case '+': return ( operand2 + operand1 ); /* 加 */ case '-': return ( operand2 - operand1 ); /* 減 */ } } /* 後序運算式的計算 */ int postfixEval(char *exp) { int operand1 = 0; /* 第1個運算元變數 */ int operand2 = 0; /* 第2個運算元變數 */ int pos = 0; /* 運算式字串索引 */ /* 剖析運算式字串迴圈 */ while ( exp[pos] != '\0' && exp[pos] != '\n') { if ( isOperator(exp[pos]) ) { /* 是不是運算子 */ /* 從堆疊取出兩個運算元 */ operand1 = pop(); operand2 = pop(); /* 計算結果存回堆疊 */ push(cal(exp[pos],operand2,operand1)); } else /* 這是運算元, 存入運算元堆疊 */ push(exp[pos]-48); pos++; /* 下一個字元 */ } return pop(); /* 傳回後序運算式的結果 */ } /* 主程式 */ int main() { char exp[1000]; /* 運算式的字串變數 */ printf("請輸入後序運算式 ==> "); gets(exp); /* 讀取運算式 */ printf("運算式: %s = %d\n", exp, postfixEval(exp)); system("PAUSE"); return 0; } 補充說明(Supplement): 我是有想法想說用空格格開 例如:10 12 + 6 * 得到結果132這樣 然後以空格做為判斷式存入堆疊 但不知道該在哪裡加入判斷式 有請板上資結神人幫忙謝謝~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.172.90.238

11/04 20:55, , 1F
一個一個字元讀,num = num*10 + (c-'0')
11/04 20:55, 1F

11/04 20:56, , 2F
遇到' '再做push()
11/04 20:56, 2F

11/04 21:11, , 3F
樓上微甜大大<(_ _)>
11/04 21:11, 3F

11/04 22:13, , 4F
你應該思考任何符號之後讀到一個數字該怎麼處理. 不過模組化
11/04 22:13, 4F

11/04 22:14, , 5F
的作法是先parsing再按照分段處理.
11/04 22:14, 5F

11/04 22:15, , 6F
驚見微甜
11/04 22:15, 6F

11/04 22:19, , 7F
意思是說我要先計算輸入運算元的長度再轉換成數值
11/04 22:19, 7F

11/04 22:19, , 8F
轉換成數值後再push...再轉換下一個運算元這樣
11/04 22:19, 8F

11/04 22:20, , 9F
大致上的想法是這樣,不過撰寫上真的有困難==
11/04 22:20, 9F

11/04 22:21, , 10F
不用知道長度 用一樓的方法就可以
11/04 22:21, 10F

11/04 22:22, , 11F
初始為0 計算後歸0
11/04 22:22, 11F

11/04 22:22, , 12F
但我怎麼知道讀取的數字式第幾位...例如說3位數之類的
11/04 22:22, 12F

11/04 22:23, , 13F

11/04 22:24, , 14F
我看法是處理任何一個數字時看堆疊,如果頂上是未完成的數字,
11/04 22:24, 14F

11/04 22:24, , 15F
透過這個技巧就可以不用知道有幾位
11/04 22:24, 15F

11/04 22:24, , 16F
則彈出來合併再推入.
11/04 22:24, 16F

11/04 22:26, , 17F
toby大你的意思我了解了..我試試看
11/04 22:26, 17F

11/04 22:29, , 18F
不需要知道有幾位,反正多讀到就把原本的*10就好
11/04 22:29, 18F

11/04 22:30, , 19F
ex.123,0*10+1=1 → 1*10+2=12 → 12*10+3=130
11/04 22:30, 19F

11/04 22:32, , 20F
http://ppt.cc/4dp3 參考這個
11/04 22:32, 20F

11/04 22:38, , 21F
數字的部分我大概懂了..感謝各位大大
11/04 22:38, 21F

11/04 22:39, , 22F
現在就式思考如何在讀玩數字後存入在讀下一個數字
11/04 22:39, 22F

11/04 22:58, , 23F
就用兩個變數,一個當前計算的,一個累加的
11/04 22:58, 23F
文章代碼(AID): #1Gbc6vZT (C_and_CPP)