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

📄 表达式求值).txt

📁 线性表的链式存储结构、线性表的顺序存储结构、循环链表等源程序。
💻 TXT
字号:
#include"stdio.h"
#include"stdlib.h"
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef struct stackf{
	char *base;//栈底指针
	char *top;//栈顶指针
	int stacksize;//保存栈的长度
}sqstack;

typedef struct{
	float *base;
	float *top;
	int stacksize;
}sqstacks;

void initstack(sqstack &s){
	s.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
	s.stacksize=STACK_INIT_SIZE;
	s.top=s.base;
}//对栈进行初始化

void initstacks(sqstacks &s){
	s.base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
	s.stacksize=STACK_INIT_SIZE;
	s.top=s.base;
}//对栈进行初始化

char gettop(sqstack s){
	return *(s.top-1);
}//获取s的栈顶元素

float gettops(sqstacks s){
	return *(s.top-1);
}

void push(sqstack &s,char c){
	*s.top=c;
	s.top++;
}//插入元素e为s的新的栈顶元素

void pushs(sqstacks &s,float f){
	*s.top=f;
	s.top++;
}

char pop(sqstack &s,char c){
	c=gettop(s);
	s.top--;
	return c;
}//删除s的当前栈顶元素.

float pops(sqstacks &s,float e){
	e=gettops(s);
	s.top--;
	return e;
}

char precede(char c1,char c2){
	if(c1=='+'){
		switch (c2){
			case '+':case '-':case ')':case '#':
				return '>';break;
			case '*':case '/':case '<':
				return '<';break;
		}
	}
	if(c1=='-'){
		switch (c2){
		case '*':case '/':case '(':
				return '<';break;
			default:
				return '>';break;
		}
	}
	if(c1=='*'){
		switch (c2){
			case '(':
				return '<';break;
			default:
				return '>';break;
		}
	}
	if(c1=='/'){
		switch (c2){
			case '(':
				return '<';break;
			default:
				return '>';break;
		}
	}
	if(c1=='('){
		switch (c2){
			case ')':
				return '=';break;
			case '+':case '-':case '*':case '/':case '(':
				return '<';break;
		}
	}
	if(c1==')'){
		switch (c2){
			case '+':case '-':case '*':case '/':case ')':case '#':
				return '>';break;
		}
	}
	if(c1=='#'){
		switch (c2){
			case '+':case '-':case '*':case '/':case '(':
				return '<';break;
			case '#':
				return '=';break;
		}
	}
}//比较符号c1和c2的优先顺序

char pd(char c){
	if(c>='0'&&c<='9')
		return 's';
	else
		return 'h';
}//用来判断字符c是数还是字符,如果是数,则返回一个字符s,如果是其他(这里的其他其实就是运算符或者是界限符),则返回h

float operate(float i1,float i2,char h){
	switch(h){
		case '*':return i1*i2;break;
		case '/':return i1/i2;break;
		case '+':return i1+i2;break;
		case '-':return i1-i2;break;
	}
}//将c1和c2对应的数据进行与h对应的操作符运算

float getftos(char c){
	float i=float(c-48);
	return i;
}//将字符变成数

void creatstack(sqstack &fuhao,sqstacks &shu){
	char c;//用来暂存输入的字符
	float a,b;
	char fu;
	char mid;
	initstack(fuhao);
	push(fuhao,'#');
	initstacks(shu);
	printf("请输入表达式:");
	scanf("%c",&c);
	while(c!='#'){
		if(pd(c)=='s'){
			pushs(shu,getftos(c));//为数时将c直接push到shu栈中
			scanf("%c",&c);
		}
		else{
			switch(precede(gettop(fuhao),c)){
			case '>':
				pops(shu,a);
				pops(shu,b);
				pop(fuhao,fu); 
				pushs(shu,operate(a,b,fu));
				break;
			case '<':
				push(fuhao,c);
				scanf("%c",&c);
				break;
			case '=':
				pop(fuhao,mid);
				scanf("%c",&c);
				break;
			}
		}
	}
}

void main(){
	sqstack optr;
	sqstacks opnd;
	creatstack(optr,opnd);
	printf("%5.2f\n",gettops(opnd));
}//此程序仍有错误
				

⌨️ 快捷键说明

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