⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lisp.cpp

📁 一个简单的LISP算术表达式计算器。 简单LISP算术表达式定义如下: (1)一个0....9的整数 (2)(运算符 表达式 表达式) 例如
💻 CPP
字号:
#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;
	for(int r=0;r<26;r++)
		cout<<" ";
		cout<<endl<<endl;
		cout<<"      本程序可以对简单的LISP算术表达式进行求值,";
		cout<<"也能对四则运算表达式进行求      ";
		cout<<"      值。同时也支持LISP算术表达式的语法的检查.你可以输入形如下面的式子:"<<endl;
		cout<<"       6  (+36)  (*(+36)6)  (+5(*(+12)(-34)))"<<endl;
		cout<<"      LISP表达式中只能输入 1,2,3,4,5,6,7,8,9,0 "<<endl<<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;//对弹出的元素进行加操作
			if(ce=='-')
			ie=ie-ie1;//对弹出的元素进行减操作
			if(ce=='*')
			ie=ie*ie1;//对弹出的元素进行乘操作
			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;
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -