新人求助!!各位高手帮忙看看!!
帮忙看看这个程序的设计思路呗 !!!先谢谢诸位高手了!!!#include<iostream.h>
#include<string.h>
#define stack_init_size 100
#define stackincrement 10
typedef struct
{
char *cbase;
char *ctop;
int istacksize;
}cstack;
//定义字符型结构体
typedef struct
{
int *ibase;
int *itop;
int istacksize;
}istack;
//定义整数型结构体
int initstack (cstack &c)
{
c.cbase = new char[100];
c.ctop = c.cbase;
return 0;
}
//初始化
int initstack (istack &i)
{
i.ibase = new int[100];
i.itop = i.ibase;
return 0;
}
//初始化
int cpush(cstack &c,char ce)
{
*(c.ctop++) = ce;
return 0;
}
//压栈
int ipush(istack &i,int ie)
{
*(i.itop++) = ie;
return 0;
}
//压栈
int cpop(cstack &c,char &ce)
{
ce = *(--c.ctop);
return 0;
}
//出栈
int ipop(istack &i,int &ie)
{
ie = *(--i.itop);
return 0;
}
//出栈
void getfun();//把输入的字符串附值给数组
int lenth=0;//输入的字符串的长度
int result=1;
static char array[100];//定义数组
int display()//打印开始屏信息
{
for(int p=0;p<80;p++)
cout<<"=";
cout<<endl<<endl;
for(int q=0;q<28;q++)
cout<<" ";
cout<<"简单LISP算术表达式计算器";
cout<<endl<<endl;
for(int r=0;r<22;r++)
cout<<" ";
cout<<"专业 姓名 学号 ";
cout<<endl<<endl;
cout<<" 本程序为简单的LISP算术表达式计算器,可以实现LISP加法表达式求值"<<endl;
for(int s=0;s<80;s++)
cout<<"=";
cout<<endl;
return 0;
}
void getfun()
{
cout<<"请输入LISP表达式: ";
cin.getline(array,100);
lenth = strlen(array);
if(lenth==0)
cout<<"你没有输入任何数据!"<<endl;
}
/*重要的函数,计算LISP表达式的函数*/
void compute()
{
char ce;
int ie1;
int ie;
cstack c;
istack i;
initstack (c);
initstack (i);
lenth = strlen(array);//求数组的长度的函数
for(int n=0;n<lenth;n++)
{
if(array[n]==')')
{
cpop(c,ce);
if(i.ibase==i.itop)
{
cout<<"LISP表达式有误!"<<endl;
break;
}
else
{
ipop(i,ie);
ie1=ie;
if(i.ibase==i.itop)
{
cout<<"LISP表达式有误!"<<endl;
break;
}
else
{
ipop(i,ie);
if(ce=='+')
ie=ie+ie1;//对弹出的元素进行加操作
ipush(i,ie);
}
}
}
else if((array[n]=='+')||(array[n]=='-')||(array[n]=='*')||(array[n]=='/'))
{
ce=array[n];
cpush(c,ce);
}
if(array[n]>47&&array[n]<58)
{
ie=(int)((int)array[n]-48);//把字符型‘0’,‘1’转化为整数型0,1,2,
ipush(i,ie);//弹出栈顶元素
}
}
ipop(i,ie);//弹出栈顶元素,其实也就是最后结果了
if(i.ibase==i.itop)
{
cout<<"LISP式计算结果为:";
for(int m=0; m<lenth; m++)
cout<<array[m];
cout<<" = "<<ie<<endl;
}
}
/*判断LISP语法的函数*/
int jugde()
{
int lp=0;
int rp=0;
int oprator=0;
int number=0;
int lenth=0;
getfun();
lenth = strlen(array);
/*统计各操作符和数字的个数*/
for(int top=0;top<lenth;top++)
{
if(array[top]=='(')
lp++;
if(array[top]==')')
rp++;
if(array[top]=='+'||array[top]=='-'||array[top]=='*'||array[top]=='/')
oprator++;
if(array[top]>47&&array[top]<58)
number++;
}
if(lenth==1)
{
if(array[0]>47&&array[0]<58)
cout<<"LISP表达式结果为: "<<array[0]<<endl;
else
cout<<"请正确输入LISP,你没有输入数字!"<<endl;
}
//判断是不是一个字符,如果是一个数字的话。就直接打出,如果不是的话,说明语法有问题
else
{
if(array[0]!='(')
cout<<"您是否忘记了开始的'(',请检查!"<<endl;
//判断括号的匹配
else
{
if(array[lenth-1]!=')')
cout<<"您是否忘记了最后的')'!"<<endl;
else
{
if(lp!=rp||rp!=oprator||oprator!=number-1||lp!=oprator||lp!=number-1||rp!=number-1)
{
if(lp>rp)
cout<<"您是否忘记了')'了!"<<endl;//判断括号的匹配
if(lp<rp)
cout<<"您是否忘记了'('了!"<<endl;//判断括号的匹配
if(lp==rp&&oprator!=lp)
cout<<"您的运算符有问题!"<<endl;
if(lp==rp&&rp==oprator&&rp!=number-1)
cout<<"您的运算数字有问题,请检查!"<<endl;
}
else
{
for (int i=0;i<lenth;i++)
{
if(array[i]=='(')
{
++i;
if (array[i]!='+'&&array[i]!='-'&&array[i]!='*'&&array[i]!='/')
cout<<"你的LISP有问题,请检查!"<<endl;
else
result=0;
i--;
}
}
}
}
}
}
return 0;
}
int main()
{
char loop[5];
display();
do
{
jugde();
if(result==0)
compute();
cout<<"是否计算下一个LISP ?(y/n)"<<endl;
cin.getline(loop,5);
}
while(loop[0]=='y'||loop[0]=='Y');
return 0;
}