C++利用鏈棧實(shí)現(xiàn)表達(dá)式求值
更新時(shí)間:2016年05月16日 16:30:55 作者:fasterfish
這篇文章主要為大家詳細(xì)介紹了C++利用鏈棧實(shí)現(xiàn)表達(dá)式求值的相關(guān)資料,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了C++利用鏈棧實(shí)現(xiàn)表達(dá)式求值的具體代碼,供大家參考,具體內(nèi)容如下
#include<iostream.h>
typedef int Status;
typedef char Cstack;
#define OK 1
#define ERROR 0
typedef struct StackNode
{
Cstack data;
struct StackNode *next;
}StackNode,*LinkStack;
Status InitStack(LinkStack &S)
{
S=NULL;
return OK;
}
Status Push(LinkStack &S,Cstack e)
{
StackNode *p;
p=new StackNode;
p->data=e;
p->next=S;
S=p;
return OK;
}
Status Pop(LinkStack &S,Cstack &e)
{
StackNode *p;
if(S==NULL) return ERROR;
e=S->data;
p=S;
S=S->next;
delete p;
return OK;
}
Cstack GetTop(LinkStack S)
{
if(S!=NULL)
return S->data;
}
Status In(Cstack ch)
{
cin>>ch;
if(ch=='+')
return OK;
else if(ch=='-')
return OK;
else if(ch=='*')
return OK;
else if(ch=='/')
return OK;
else if(ch=='#')
return OK;
else
return ERROR;
}
Cstack Precede(Cstack t1,Cstack t2)
{
switch(t1)
{
case '+':
switch(t2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '<';break;
case '/':return '<';break;
case '(':return '<';break;
case ')':return '>';break;
case '#':return '>';break;
}
break;
case '-':
switch(t2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '<';break;
case '/':return '<';break;
case '(':return '<';break;
case ')':return '>';break;
case '#':return '>';break;
}
break;
case '*':
switch(t2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '>';break;
case '/':return '>';break;
case '(':return '<';break;
case ')':return '>';break;
case '#':return '>';break;
}
break;
case '/':
switch(t2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '>';break;
case '/':return '>';break;
case '(':return '<';break;
case ')':return '>';break;
case '#':return '>';break;
}
break;
case '(':
switch(t2)
{
case '+':return '<';break;
case '-':return '<';break;
case '*':return '<';break;
case '/':return '<';break;
case '(':return '<';break;
case ')':return '=';break;
case '#':return '>';break;
}
break;
case ')':
switch(t2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '>';break;
case '/':return '>';break;
case '(':return '=';break;
case ')':return '>';break;
case '#':return '>';break;
}
break;
case '#':
return '=';
break;
}
}
Cstack Operator(Cstack t1,Cstack t2,Cstack t3)
{
t1=t1-48;
t3=t3=48;
int c;
switch(t2)
{
case '+':
c=t1+t2+48;
return c;
break;
case '-':
c=t1-t2+48;
return c;
break;
case '*':
c=t1*t2+48;
return c;
break;
case '/':
c=t1/t2+48;
return c;
break;
}
}
void main()
{
LinkStack OPTR,OPAN;
Cstack cha1,cha2,x,cha,thea;
InitStack(OPTR);
InitStack(OPAN);
Push(OPTR,'#');
cout<<"輸入表達(dá)式的中間值及最終結(jié)果局限于0~9之間的個(gè)位數(shù)并以#號(hào)結(jié)束"<<endl;
while(cha!='#'||GetTop(OPTR)!='#')
{
cin>>cha;
if(!In(cha))
Push(OPAN,cha);
else
switch(Precede(GetTop(OPTR),cha))
{
case '<':
Push(OPTR,cha);
cin>>cha;
break;
case '>':
Pop(OPTR,thea);
Pop(OPAN,cha1);
Pop(OPAN,cha2);
Push(OPAN,(cha1,thea,cha2));
break;
case '=':
Pop(OPTR,x);
break;
}
}
cout<<GetTop(OPAN)<<endl;
return;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)C++程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:
相關(guān)文章
VS2010 boost標(biāo)準(zhǔn)庫(kù)開(kāi)發(fā)環(huán)境安裝教程
這篇文章主要為大家詳細(xì)介紹了VS2010 boost標(biāo)準(zhǔn)庫(kù)開(kāi)發(fā)環(huán)境的安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
C++類(lèi)與對(duì)象深入之運(yùn)算符重載與const及初始化列表詳解
運(yùn)算符是程序中最最常見(jiàn)的操作,例如對(duì)于內(nèi)置類(lèi)型的賦值我們直接使用=賦值即可,因?yàn)檫@些編譯器已經(jīng)幫我們做好了,但是對(duì)象的賦值呢?能直接賦值嗎2022-06-06
初學(xué)C語(yǔ)言基本運(yùn)算和表達(dá)式
在本文里小編給大家分享的是關(guān)于C語(yǔ)言基本運(yùn)算和表達(dá)式的相關(guān)知識(shí)點(diǎn),需要的朋友們跟著學(xué)習(xí)下。2019-08-08
構(gòu)造函數(shù)不能聲明為虛函數(shù)的原因及分析
構(gòu)造函數(shù)不需要是虛函數(shù),也不允許是虛函數(shù),因?yàn)閯?chuàng)建一個(gè)對(duì)象時(shí)我們總是要明確指定對(duì)象的類(lèi)型,盡管我們可能通過(guò)實(shí)驗(yàn)室的基類(lèi)的指針或引用去訪問(wèn)它但析構(gòu)卻不一定,我們往往通過(guò)基類(lèi)的指針來(lái)銷(xiāo)毀對(duì)象2013-10-10

