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

📄 sun.c

📁 算术表达式 给出算术表达式 计算结果 堆栈stack
💻 C
字号:
#include<stdio.h>
#include<math.h>
#include<malloc.h>
#define MAX 50


typedef struct STACKCH STACKCH;
typedef struct STACKNUM STACKNUM;
typedef struct STR STR;

struct STACKCH
{
	char elem[MAX];
	int top;
};

struct STACKNUM
{
	int elem[MAX];
	int top;
};

struct STR
{
	char str[MAX];
	int cur;
};



char op[]={'^','*','/','+','-','(',')','#'};

int gradenum[8][2]={5,6,4,3,4,3,2,1,2,1,0,7,7,0,0,0};

void Initstack1(STACKCH *s)
{
	(*s).top=-1;
}

void Initstack2(STACKNUM *s)
{
	(*s).top=-1;
}

void Push1(STACKCH *s,char e)
{
	if((*s).top==MAX-1)
	{
		printf("stack is full\n");
		return;
	}
	(*s).top++;

	(*s).elem[(*s).top]=e;
}

void Push2(STACKNUM *s,int e)
{
	if((*s).top==MAX-1)
	{
		printf("stack is full\n");
		return;
	}
	(*s).top++;
	(*s).elem[(*s).top]=e;
}

char Pop1(STACKCH *s,char e)
{
	if((*s).top==-1)
	{
		printf("stack is empty\n");
		return 0;
	}
	e=(*s).elem[(*s).top--];
	return e;
}

int Pop2(STACKNUM *s,int e)
{
	if((*s).top==-1)
	{
		printf("stack is empty\n");
		return 0;
	}
	e=(*s).elem[(*s).top--];
	return e;
}

char Gettop1(STACKCH *s)
{
	char e;
	if((*s).top==-1)
	{
		printf("stack is empty\n");
		return 0;
	}
	e=(*s).elem[(*s).top];
	return e;
}

int Gettop2(STACKNUM *s)
{
	int e;
	if((*s).top==-1)
	{
		printf("stack is empty\n");
		return 0;
	}
	e=(*s).elem[(*s).top];
	return e;
}

void Gets(STR *s )
{
	
	printf("please enter the expression:");
	scanf("%s",(*s).str);
	((*s).cur)=0;
}

int In(char c,char op[])
{
	int i;
	
	for(i=0;i<8;i++)
	    if(c==op[i])
			return i;
	
	return -1;
}

char Getnextchar(STR *s)
{
	char c;
	c=(*s).str[(*s).cur++];
	return c;
}

char Precede(char inc,char outc)
{
	int in,out;
	in=In(inc,op);
	out=In(outc,op);
	if(gradenum[in][0]<gradenum[out][1])
		return '<';
	else if(gradenum[in][0]==gradenum[out][1])
		return '=';
	else
		return '>';
}

int Operate(int a,char theta,int b)
{
	int res;
	switch(theta)
	{
	case'+':res=a+b;break;
	case'-':res=a-b;break;
	case'*':res=a*b;break;
	case'/':res=a/b;break;
	case'^':res=pow(a,b);break;
	}
	return res;
}


int main()
{
    char x;
	char theta;
	int a,b;
	char c;
	int minusmark;
    STACKCH *OPTR;	
    STACKNUM *OPND;
    STR *EXP;
    OPTR=(STACKCH *)malloc(sizeof(STACKCH));
	if(OPTR==NULL)
		return 0;
	OPND=(STACKNUM *)malloc(sizeof(STACKNUM));
	if(OPND==NULL)
		return 0;
	EXP=(STR *)malloc(sizeof(STR));
	if(EXP==NULL)
		return 0;
	
	Initstack1(OPTR);
	Initstack2(OPND);
	Push1(OPTR,'#');
	Gets(EXP);
	c=Getnextchar(EXP);
	while(c!='#'||Gettop1(OPTR)!='#')
	{
		if(In(c,op)==-1)//是数字或者字母
		{
			int total;
			if(c>='a'&&c<='z')
			{
				char word[MAX];
				int i=0;
				word[i]=c;
				
				while(In(EXP->str[EXP->cur],op)==-1)
					word[++i]=Getnextchar(EXP);

				word[i+1]='\0';

                printf("please enter the number of %s:",word);
                scanf("%d",&total);
			}
			else//是数字
			{
				int num[MAX];
				int i=0;
				int cs,s;
				num[i]=c-48;
				while(In(EXP->str[EXP->cur],op)==-1)
					num[++i]=Getnextchar(EXP)-48;
				for(total=0,cs=1;i>=0;i--)
				{
					s=num[i]*cs;
					cs=cs*10;
					total=total+s;
				}
			}
            if(minusmark==1)
				{
					total=0-total;
					minusmark=0;
				}
			Push2(OPND,total);
			c=Getnextchar(EXP);
		}
		else// 是运算符
		{
            if(c=='-')
			{
				if(EXP->str[EXP->cur-2]=='('||EXP->cur-2<0)//若'-'是一目减
				{
					minusmark=1;
					c=Getnextchar(EXP);
					continue;//!!! 此处不能是break 若用break 直接跳出整个循环体 即while 的循环
				}
			}
			switch(Precede(Gettop1(OPTR),c))
			{
			case'<':Push1(OPTR,c);c=Getnextchar(EXP);break;
			case'=':x=Pop1(OPTR,x);c=Getnextchar(EXP);break;
			case'>':
				theta=Pop1(OPTR,theta);
				b=Pop2(OPND,b);
				a=Pop2(OPND,a);
				Push2(OPND,Operate(a,theta,b));break;
			}
		}
		
	}
	printf("the final result is:%d\n",Gettop2(OPND));
	return 0;
}








⌨️ 快捷键说明

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