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

📄 exper.c

📁 实现一个表达式的求值问题,程序支持四元运算,并支持优先级.
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>

typedef char Elemtype;
typedef int Elemtype1;
typedef struct stack
{
	Elemtype data;
	struct stack *top;
}Stack;

typedef struct stack1
{
	Elemtype1 data;
	struct stack1 *top;
}Stack1;
 
void initstack(Stack *s)
{
	s->top=NULL;
}

void initstack1(Stack1 *s)
{
	s->top=NULL;
}

void push(Stack *s,Elemtype x)
{
	Stack *p;
	p=(Stack *)malloc(sizeof(Stack));
	p->data=x;
	p->top=s->top;
	s->top=p;
}
void push1(Stack1 *s,Elemtype1 x)
{
	Stack1 *p;
	p=(Stack1 *)malloc(sizeof(Stack1));
	p->data=x;
	p->top=s->top;
	s->top=p;
}

void pop(Stack *s,Elemtype *x)
{
	Stack *p;

	p=s->top;
	*x=p->data;
	s->top=p->top;
	free(p);
}

void pop1(Stack1 *s,Elemtype1 *x)
{
	Stack1 *p;

	p=s->top;
	*x=p->data;
	s->top=p->top;
	free(p);
}

void gettop(Stack *s,Elemtype *x)
{
	*x=s->top->data;
}

int Isempty1(Stack1 *s)
{
	return s->top==NULL;
}

int Isempty(Stack *s)
{
	return s->top==NULL;
}

int Int(char ch)
{
	if(ch<='9'&&ch>='0')
		return(1);
	else
		return(0);
}

char compair(Stack *singer,Elemtype Outstack)
{
	Elemtype Instack;

	gettop(singer,&Instack);
	switch(Instack)
	{
		case '+': if(Outstack=='+'||Outstack=='-'||Outstack==')'||Outstack=='#')
					  return('>');
				  else
					  return('<');
				  break;
		case '-': if(Outstack=='+'||Outstack=='-'||Outstack==')'||Outstack=='#')
					  return('>');
				  else
					  return('<');
				  break;
		case '*': if(Outstack=='(')
					  return('<');
				  else
					  return('>');
				  break;	
		case '/': if(Outstack=='(')
					  return('<');
				  else
					  return('>');
				  break;	
		case '(': if(Outstack==')')
					  return('=');
				  else if(Outstack=='#')
					  return('.');
				  else
					  return('<');
				  break;
		case '#': if(Outstack=='#')
					  return('*');
				  else if(Outstack=='('||Outstack==')')
					  return('.');
				  else
					  return('<');
				  break;	
	}
}

void operate(Elemtype1 *sum,Elemtype siger,Elemtype1 r)
{
	switch(siger)
	{
		case '+' :  *sum+=r;
					break;
		case '-' :  *sum-=r;
					break;
		case '*' :  *sum*=r;
					break;
		case '/' :  if(r==0){
						printf("\nerror!\n");
						exit(-1);
					}
					else
						*sum/=r;
					break;
	}
}

void Oprandtype(Stack *singer,Stack1 *sdata)
{
	Elemtype c,ch;
	Elemtype1 c1,c2;
	int flag=0;

	c=getchar();

	push(singer,c);
	c=getchar();
	while(c!='\n'&&flag!=1)
	{
	

		if(Int(c))
		{
			c1=c-'0';
			push1(sdata,c1);
			printf("%c",c);
			c=getchar();
		}
		else
			switch(compair(singer,c))
			{
				case '<':  push(singer,c);
							c=getchar();
						   break;
				case '=':  pop(singer,&c);
							c=getchar();
							break;
				case '>':  	if(Isempty1(sdata)){
									printf("\nerror!\n");
									flag=1;
									break;
								}
							pop(singer,&ch);
							printf("%c",ch);
							pop1(sdata,&c1);
							if(Isempty1(sdata)){
									printf("\nerror!\n");
									flag=1;
									break;
								}
							pop1(sdata,&c2);
							operate(&c2,ch,c1);
							push1(sdata,c2);
							break;
				case '*':  if(Isempty1(sdata))
								printf("\nerror!\n");
							else{
								pop1(sdata,&c1);
								printf("\nthe result is %d\n",c1);
								c=getchar();
							}
							break;
				case '.':   printf("\nerror!\n");
							flag=1;
							break;
						  
			}
	}

}

int main()
{
	Stack Singer;
	Stack1 Sdata;

	initstack(&Singer);
	initstack1(&Sdata);
	Oprandtype(&Singer,&Sdata);
	return(0);
}

⌨️ 快捷键说明

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