表达式求解
表達式求解問題
第四次數據結構實驗:
實驗三:表達式求值
?
?
實驗目的:
1、掌握順序棧結點類型的定義
2、掌握棧的插入和刪除結點操作的特點;
3、熟悉對棧的一些基本操作和具體的函數定義。
代碼:
?
?
??1?/*?Status.h?各種常量狀態、結構體的聲明文件*/??2?#pragma?once
??3?#include?<malloc.h>
??4?#include?<stdlib.h>
??5?
??6?#define?TRUE?1
??7?#define?FALSE?0
??8?#define?OK?1
??9?#define?ERROR?0
?10?#define?OVERFLOW?-2
?11?#define?INFEASIBLE?-1
?12?
?13?typedef?int?Status;
?14?
?15?typedef?char?SElemType;
?16?#define?STACK_INIT_SIZE?100
?17?#define?STACKINCREMENT??10
?18?struct?SqStack{
?19?????SElemType?*base;
?20?????SElemType?*top;
?21?????int?stacksize;
?22?};
?23?
?24?typedef?char?QElemType;
?25?#define?MAXQSIZE?100
?26?struct?SqQueue{
?27?????QElemType?*base;
?28?????int?front;
?29?????int?rear;
?30?};
?31?
?32?/*?SqStack.h?CSqStack類的聲明文件*/
?33?#pragma?once
?34?#include?"Status.h"
?35?
?36?class?CSqStack
?37?{
?38?private:
?39?????//棧數據結構
?40?????SqStack?S;
?41?public:
?42?????CSqStack(void);
?43?????~CSqStack(void);
?44?????//壓棧
?45?????Status?Push(SElemType?e);
?46?????//出棧
?47?????Status?Pop(SElemType&?e);
?48?????//返回棧頂元素,非彈出
?49?????char?GetTop();
?50?????//判斷是否為空
?51?????bool?Empty();
?52?private:
?53?????//初始化棧數據結構,放在構造函數里,私有了..
?54?????Status?InitStack();
?55?};
?56?/*?SqStack.h?CSqStack類的定義文件*/
?57?#include?"SqStack.h"
?58?
?59?CSqStack::CSqStack(void)
?60?{
?61?????this->InitStack();
?62?}
?63?
?64?CSqStack::~CSqStack(void)
?65?{
?66?????free(this->S.base);
?67?}
?68?
?69?//壓棧
?70?Status?CSqStack::Push(SElemType?e)
?71?{
?72?????if?(S.top?-?S.base?>=?S.stacksize)
?73?????{
?74?????????S.base?=?(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
?75?????????if?(!S.base)
?76?????????????exit(OVERFLOW);
?77?????????S.top?=?S.base?+?S.stacksize;
?78?????????S.stacksize?+=?STACKINCREMENT;
?79?????}
?80?????*S.top++?=?e;
?81?????
?82?????return?OK;
?83?}
?84?
?85?//出棧
?86?Status?CSqStack::Pop(SElemType&?e)
?87?{
?88?????if?(S.top?==?S.base)
?89?????????return?ERROR;
?90?????e?=?*--S.top;
?91?
?92?????return?OK;
?93?}
?94?
?95?//返回棧頂元素,非彈出
?96?char?CSqStack::GetTop()
?97?{
?98?????if(S.top?==?S.base)
?99?????????return?'?';
100?
101?????return?*(S.top-1);
102?}
103?
104?//判斷是否為空
105?bool?CSqStack::Empty()
106?{
107?????return?S.top?==?S.base???TRUE?:?FALSE?;?
108?}
109?
110?//初始化棧數據結構,放在構造函數里,私有了..
111?Status?CSqStack::InitStack()
112?{
113?????S.base?=?(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
114?????if(!S.base)
115?????????exit(OVERFLOW);
116?????S.top?=?S.base;
117?????S.stacksize?=?STACK_INIT_SIZE;
118?
119?????return?OK;
120?}
121?
122?/*?
123?///
124?Main.cpp?
125?main函數所在文件
126?0x0o@Live.Cn
127?08.11.05
128?Vista-U?+?VS2008?下編譯通過.
129?
130?*/
131?
132?#include?<iostream>
133?#include?"Status.h"
134?#include?"SqStack.h"
135?using?namespace?std;
136?
137?char?Operate(char?a,char?ch,char?b)
138?{
139?????switch?(ch)
140?????{
141?????case?'+':
142?????????return?a+b-48;
143?????case?'-':
144?????????return?a-b+48;
145?????case?'*':
146?????????return?(a-48)*(b-48)+48;
147?????case?'/':
148?????????return?(a-48)/(b-48)+48;
149?????}
150?}
151?
152?char?Precede(char?ch1,char?ch2)
153?{
154?????if?(ch1==ch2?&&?ch2=='#')
155?????????return?'=';
156?????if?(ch1==ch2?&&?ch1!='#')
157?????????return?'>';
158?????if?(ch1?==?'#')
159?????????return?'<';
160?????if?(ch1=='('?&&?ch2==')')
161?????????return?'=';
162?????if?(ch1==?'('?||?ch2=='(')
163?????????return?'<';
164?????if?(ch2==?')'?||?ch1==')')
165?????????return?'>';
166?????if(ch1=='*'?||?ch1=='/')
167?????????return?'>';
168?????if?(ch2=='*'?||?ch2=='/')
169?????????return?'<';
170?????else
171?????????return?'>';
172?}
173?
174?bool?IsOpnd(char?ch)
175?{
176?????if(?ch>=48?&&?ch<=57)
177?????????return?TRUE;
178?????else
179?????????return?FALSE;
180?}
181?
182?char?EvaluateExpression(CSqStack&?OPND,CSqStack&?OPTR)
183?{
184?????char?ch;
185?????ch?=?getchar();
186?
187?????while?(ch?!=?'#'?||?OPTR.GetTop()?!=?'#')
188?????{
189?????????if(IsOpnd(ch))
190?????????{
191?????????????OPND.Push(ch);
192?????????????ch?=?getchar();
193?????????}
194?????????else
195?????????{
196?????????????switch?(Precede(OPTR.GetTop(),ch))
197?????????????{
198?????????????case?'<':
199?????????????????OPTR.Push(ch);
200?????????????????ch?=?getchar();
201?????????????????break;
202?????????????case?'=':
203?????????????????char?x;
204?????????????????OPTR.Pop(x);
205?????????????????ch?=?getchar();
206?????????????????break;
207?????????????case?'>':
208?????????????????char?theta,a,b;
209?????????????????OPTR.Pop(theta);
210?????????????????OPND.Pop(b);OPND.Pop(a);
211?????????????????OPND.Push(Operate(a,theta,b));
212?????????????????break;
213?????????????default:
214?????????????????cout<<"Error!"<<endl;
215?????????????}
216?????????}
217?????}
218?????
219?????return?OPND.GetTop();
220?
221?}
222?
223?int?main()
224?{
225?????char?ch;
226?????CSqStack?OPTR,OPND;
227?????cout<<"Please?Input?The?Expression:"<<endl;
228?
229?????OPTR.Push('#');
230?
231?????ch?=?EvaluateExpression(OPND,OPTR);
232?
233?????cout<<(int)(ch-48)<<endl;
234?
235?
236?????return?0;
237?}
238?
?
?
?
?
以上代碼存在問題!
很明顯,用char來存輸入的數據,如果100*2怎么辦?彈出來的是0….太尷尬了
這個問題其實也挺好解決的,例如:堆棧的數據類型是int,然后把字符接收時處理,如果下一個還是數字,就把此數字×10+下一個數字,接受完的時候再存入堆棧即可..。
問題是這個代碼的其它地方我還沒跟蹤明白,貌似構造的表達式出現某某現象時,最終結果是一個錯誤的數字…
哎,懶得改了..>
?
今天代碼寫的有點取巧了,明顯用的就是回文序列里面的代碼,復用果真很舒服,省了很多時間的說…。
?
?
?
?????????????????????????????????????? --------by?? 0x0o
????????????????????????????????????????? Time: 08.11.05?15:41
?
轉載于:https://www.cnblogs.com/ns517/archive/2008/11/05/1327378.html
總結
- 上一篇: 8 种有趣的用于 Web 品牌的动物
- 下一篇: 棍子节快乐~ 顺便转一篇weka源码分析