四則演算の実現
3907 ワード
引き続き復習データ構造…
二つのスタックを使用して実装されました.操作数スタックとオペレータスタックです.
主なプロセスは、中序式を後の式に変換し、順番に演算します.
簡単なプロセス:1+8-7(中序)-->18 7-+(後序)->11+(演算8-7)-->2(演算1+1)
ソース:
二つのスタックを使用して実装されました.操作数スタックとオペレータスタックです.
主なプロセスは、中序式を後の式に変換し、順番に演算します.
簡単なプロセス:1+8-7(中序)-->18 7-+(後序)->11+(演算8-7)-->2(演算1+1)
ソース:
#include "stack.h" //
#define SIZE 256
#define PSIZE 512
char postOrder[SIZE];
Stack<char> s(SIZE);
Stack<int> res(SIZE);
int prior(char ch) //
{
if(ch=='+'||ch=='-')return 2;
else if(ch=='*'||ch=='/')return 3;
else if(ch=='('||ch==')')return 4;
else if(ch=='=')return 1;
else return 0;
}
int comp(int i,int j,char c) //
{
switch(c)
{
case '+':
return i+j;
case '-':
return i-j;
case '*':
return i*j;
case '/':
return i/j;
default:
return -1;
}
}
int compute()
{
for(int i=0;i!=strlen(postOrder);)
{
if (postOrder[i]==' '||postOrder[i]==NULL||postOrder[i]=='=')
{
++i;
continue;
}
if (postOrder[i]>='0'&&postOrder[i]<='9'/*&&!res.isFull()*/)
{
int val=0; //
while(postOrder[i]>='0'&&postOrder[i]<='9')
{
val=10*val+(postOrder[i]-'0');
i++;
}
res.push(val);
continue;
}
if(res.top>=1)
{
int p=res.pop(); //
int q=res.pop();
int s1=comp(q,p,postOrder[i]); //
res.push(s1);
++i;
}
}
return res.pop();
}
void change(char *prestr)
{
int i=0,j=0;
while(i<SIZE)
{
if (prestr[i]==' '||prestr[i]==NULL)
{i++;continue;}
if(prestr[i]>='0'&&prestr[i]<='9') //
{
while(prestr[i]>='0'&&prestr[i]<='9')
{ // ,
postOrder[j++]=prestr[i++];
}
postOrder[j++]=' ';
}
if(prestr[i]==')') // , ,
{
int flag = 0;
while(!s.isEmpty())
{
if(s.data[s.top]=='(')
{
flag=1;
++i;
s.pop();
break;
}
postOrder[j++]=s.pop();
postOrder[j++]=' ';
}
if(s.isEmpty()&&flag==0)
{
cout<<"Error:Do you miss a '('?"<<endl;
exit(0);
}
}
if(prestr[i]!=')'&&!s.isFull()&&(s.isEmpty() // ,
||prior(prestr[i])>prior(s.data[s.top])))
{
s.push(prestr[i++]);
}
else if(prestr[i]!=')')
{
while(!s.isEmpty()&&prior(prestr[i])<=prior(s.data[s.top])
&&s.data[s.top]!='(') // , ,
{ // ,
postOrder[j++]=s.pop(); //
postOrder[j++]=' ';
}
s.push(prestr[i++]);
}
}
while(!s.isEmpty()) // , ,
{
if(s.data[s.top]=='(')
{
cout<<"Error:Do you miss a ')'?"<<endl;
exit(0);
}
postOrder[j++]=s.pop();
postOrder[j++]=' ';
}
}
int main()
{
char preStr[PSIZE];
char ch;
int preIndex=0;
memset(preStr,NULL,sizeof(preStr));
for(int i=0;i<PSIZE;++i)
{
ch=getchar();
if (ch==' '||ch==NULL)continue;
if(ch=='/n')break;
preStr[preIndex++]=ch;
if(ch=='=')break;
}
if(strlen(preStr)>SIZE)
{
cout<<"Exception:/nThe size of expression is beyond default value."
<<"/nThe length of a string cannot be larger than "<<SIZE<<"./n";
exit(0);
}
change(preStr);
for(int i=0;i<strlen(postOrder);++i)
{
cout<<postOrder[i];
}
cout<<endl;
for(int i=0;i!=strlen(preStr);++i)
{
cout<<preStr[i];
}
cout<<endl<<compute()<<endl;
return 0;
}