四則演算の実現

3907 ワード

引き続き復習データ構造…
二つのスタックを使用して実装されました.操作数スタックとオペレータスタックです.
主なプロセスは、中序式を後の式に変換し、順番に演算します.
簡単なプロセス: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;
}