用栈实现算数表达式求值(C语言(基础版))

要求:输入以#为结束的算数表达式(包括+,-,*,/)并求值

1.基础的栈结构书写(包括创建栈,判断栈是否为空,以及数据的压栈和出栈)【可参考MOOC上陈越姥姥的相关数据结构课程】

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct SNode* Stack;
struct SNode {									//链表结构
	char Data;
	int  Number;
	struct SNode* next;
};

Stack CreateStack(Stack S) {					//建立新的节点
	S = (Stack)malloc(sizeof(struct SNode));
	S->next = NULL;
	return S;
}

int IsEmpty(Stack S) {							//判断栈是否为空
	return(S->next==NULL);
}

void Push(char item,Stack S,int i) {					//压栈
	Stack TmpCell;
	TmpCell = (Stack)malloc(sizeof(struct SNode));
	TmpCell->Data = item;
	TmpCell->Number=i;
	TmpCell->next = S->next;
	S->next = TmpCell;
}

char Pop(Stack S) {								//出栈
	Stack FirstCell;
	char TopElem;
	if(IsEmpty(S)) {
		printf("堆栈空");
	} else {
		FirstCell = S->next;
		S->next = FirstCell->next;
		TopElem = FirstCell->Data;
		free(FirstCell);
		return TopElem;
	}
}

2.运算符先后顺序的判断

char Compare(char N,char S) {							//判断运算符的先后性
	if(N=='+'&&S=='+'||N=='-'&&S=='+'||N=='*'&&S=='+'||N=='/'&&S=='+')
		return '>';
	else if(N=='+'&&S=='-'||N=='-'&&S=='-'||N=='*'&&S=='-'||N=='/'&&S=='-')
		return '>';
	else if(N=='*'&&S=='*'||N=='*'&&S=='/'||N=='/'&&S=='/'||N=='/'&&S=='*')
		return '>';
	else if(N=='+'&&S=='*'||N=='-'&&S=='*'||N=='+'&&S=='/'||N=='-'&&S=='/')
		return '<';
	else if(N=='+'&&S=='#'||N=='-'&&S=='#'||N=='*'&&S=='#'||N=='/'&&S=='#')
		return '>';
	else if(N=='#'&&S=='+'||N=='#'&&S=='-'||N=='#'&&S=='*'||N=='#'&&S=='/')
		return '<';
}

3.运算

int operate(int a,char M,int b) {				//进行运算
	int s;
	switch(M) {
		case'+':
			s=a+b;
			break;
		case'-':
			s=a-b;
			break;
		case'*':
			s=a*b;
			break;
		case'/':
			s=a/b;
			break;
		default:
			printf("error");
			break;
	}
	return s;
}

4.运算与栈结构相结合

Stack OP(Stack OPTR,Stack OPND) {
	char N,M,W;
	int a,b,flag=0,i=1,j,A=0,B=0,C,D,E,F[10];
	Stack TOP_1,TOP_2;
	Push('#',OPTR,1);							//将‘#’压入OPTR栈中
	scanf("%c",&N);							//从键盘中读入字符
	TOP_1=OPND->next;						//将TOP_1设置为数据栈的栈顶
	TOP_2=OPTR->next;						//将TOP_2设置为运算符栈的栈顶

	while(N!='#') {
		if(N>='0'&&N<='9') {
			if(flag==0) {
				Push(N,OPND,i);
				flag=1; 
			} else {
				i++;
				Push(N,OPND,i);
			}
		} else if(N=='+'||N=='-'||N=='*'||N=='/'||N=='#') {
			i=1;
			flag=0;
			W=Compare(TOP_2->Data,N);
			switch(W) {
				case'<': {
					Push(N,OPTR,1);
					break;
				}
				case'>': {
					M=Pop(OPTR);
					TOP_1=OPND->next;
					i=TOP_1->Number;
					A=0;
					a=0;
					for(j=0; j<i; j++) {
						a=Pop(OPND)-'0';
						A=a*pow(10,j)+A;
					}
					TOP_1=OPND->next;
					i=TOP_1->Number;
					B=0;
					b=0;
					for(j=0; j<i; j++) {
						b=Pop(OPND)-'0';
						B=b*pow(10,j)+B;
					}
					C=operate(B,M,A);
					D=C;
					E=0;
					do {
						E++;
						F[E]=D%10;
						D=D/10;
					} while(D!=0);
					for(j=E; j>0; j--) {
						Push(F[j]+'0',OPND,E);
					}
					TOP_2=OPTR->next;
					if(TOP_2->Data=='#') {
						Push(N,OPTR,1);
						i=1;
					} else {						//还有BUG
						W=Compare(TOP_2->Data,N);
						switch(W) {
							case'<': {
								Push(N,OPTR,1);
								break;
							}
							case'>': {
								M=Pop(OPTR);
								i=TOP_1->Number;
								A=0;
								a=0;
								for(j=0; j<i; j++) {
									a=Pop(OPND)-'0';
									A=a*pow(10,j)+A;
								}
								TOP_1=OPND->next;
								i=TOP_1->Number;
								B=0;
								b=0;
								for(j=0; j<i; j++) {
									b=Pop(OPND)-'0';
									B=b*pow(10,j)+B;
								}
								C=operate(B,M,A);
								D=C;
								E=0;
								do {
									E++;
									F[E]=D%10;
									D=D/10;
								} while(D!=0);
								for(j=E; j>0; j--) {
									Push(F[j]+'0',OPND,E);
								}
								TOP_2=OPTR->next;
								if(TOP_2->Data=='#') {
									Push(N,OPTR,1);
									i=1;
								} else {						//还有BUG
									W=Compare(TOP_2->Data,N);
									M=Pop(OPTR);
									i=TOP_1->Number;
									A=0;
									a=0;
									for(j=0; j<i; j++) {
										a=Pop(OPND)-'0';
										A=a*pow(10,j)+A;
									}
									TOP_1=OPND->next;
									i=TOP_1->Number;
									B=0;
									b=0;
									for(j=0; j<i; j++) {
										b=Pop(OPND)-'0';
										B=b*pow(10,j)+B;
									}
									C=operate(B,M,A);
									D=C;
									E=0;
									do {
										E++;
										F[E]=D%10;
										D=D/10;
									} while(D!=0);
									for(j=E; j>0; j--) {
										Push(F[j]+'0',OPND,E);
									}
									Push(N,OPTR,1);
								}
								break;
							}
							default:
								printf("error");
								break;
						}
						i=1;
					}
					break;
				}
				default:
					printf("error");
					break;
			}
		}
		TOP_1=OPND->next;
		TOP_2=OPTR->next;
		scanf("%c",&N);
	}
	TOP_1=OPND->next;
	M=Pop(OPTR);
	i=TOP_1->Number;
	A=0;
	a=0;
	for(j=0; j<i; j++) {
		a=Pop(OPND)-'0';
		A=a*pow(10,j)+A;
	}
	TOP_1=OPND->next;
	i=TOP_1->Number;
	B=0;
	b=0;
	for(j=0; j<i; j++) {
		b=Pop(OPND)-'0';
		B=b*pow(10,j)+B;
	}
	C=operate(B,M,A);
	D=C;
	E=0;
	do{
		E++;
		F[E]=D%10;
		D=D/10;
	} while(D!=0);
	for(j=E; j>0; j--) {
		Push(F[j]+'0',OPND,E);
	}
	TOP_2=OPTR->next;
	if(TOP_2->Data=='#') {
		return OPND;
	} else {
		W=Compare(TOP_2->Data,N);
		M=Pop(OPTR);
		i=TOP_1->Number;
		A=0;
		a=0;
		for(j=0; j<i; j++) {
			a=Pop(OPND)-'0';
			A=a*pow(10,j)+A;
		}
		TOP_1=OPND->next;
		i=TOP_1->Number;
		B=0;
		b=0;
		for(j=0; j<i; j++) {
			b=Pop(OPND)-'0';
			B=b*pow(10,j)+B;
		}
		C=operate(B,M,A);
		D=C;
		E=0;
		do {
			E++;
			F[E]=D%10;
			D=D/10;
		} while(D!=0);
		for(j=E; j>0; j--) {
			Push(F[j]+'0',OPND,E);
		}
		return OPND;
	}
}

5.主函数

int main() {
	int B=0,b,j,i;
	Stack OPTR,OPND,TOP_1;
	OPTR=CreateStack(OPTR);
	OPND=CreateStack(OPND);
	OPND=OP(OPTR,OPND);
	TOP_1=OPND->next;
	i=TOP_1->Number;
	for(j=0; j<i; j++) {
		b=Pop(OPND)-'0';
		B=b*pow(10,j)+B;
	}
	printf("%d",B);
	return 0;
}

完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct SNode* Stack;
struct SNode {									//链表结构
	char Data;
	int  Number;
	struct SNode* next;
};

Stack CreateStack(Stack S) {					//建立新的节点
	S = (Stack)malloc(sizeof(struct SNode));
	S->next = NULL;
	return S;
}

int IsEmpty(Stack S) {							//判断栈是否为空
	return(S->next==NULL);
}

void Push(char item,Stack S,int i) {					//压栈
	Stack TmpCell;
	TmpCell = (Stack)malloc(sizeof(struct SNode));
	TmpCell->Data = item;
	TmpCell->Number=i;
	TmpCell->next = S->next;
	S->next = TmpCell;
}

char Pop(Stack S) {								//出栈
	Stack FirstCell;
	char TopElem;
	if(IsEmpty(S)) {
		printf("堆栈空");
	} else {
		FirstCell = S->next;
		S->next = FirstCell->next;
		TopElem = FirstCell->Data;
		free(FirstCell);
		return TopElem;
	}
}

char Compare(char N,char S) {							//判断运算符的先后性
	if(N=='+'&&S=='+'||N=='-'&&S=='+'||N=='*'&&S=='+'||N=='/'&&S=='+')
		return '>';
	else if(N=='+'&&S=='-'||N=='-'&&S=='-'||N=='*'&&S=='-'||N=='/'&&S=='-')
		return '>';
	else if(N=='*'&&S=='*'||N=='*'&&S=='/'||N=='/'&&S=='/'||N=='/'&&S=='*')
		return '>';
	else if(N=='+'&&S=='*'||N=='-'&&S=='*'||N=='+'&&S=='/'||N=='-'&&S=='/')
		return '<';
	else if(N=='+'&&S=='#'||N=='-'&&S=='#'||N=='*'&&S=='#'||N=='/'&&S=='#')
		return '>';
	else if(N=='#'&&S=='+'||N=='#'&&S=='-'||N=='#'&&S=='*'||N=='#'&&S=='/')
		return '<';
}

int operate(int a,char M,int b) {				//进行运算
	int s;
	switch(M) {
		case'+':
			s=a+b;
			break;
		case'-':
			s=a-b;
			break;
		case'*':
			s=a*b;
			break;
		case'/':
			s=a/b;
			break;
		default:
			printf("error");
			break;
	}
	return s;
}
Stack OP(Stack OPTR,Stack OPND) {
	char N,M,W;
	int a,b,flag=0,i=1,j,A=0,B=0,C,D,E,F[10];
	Stack TOP_1,TOP_2;
	Push('#',OPTR,1);							//将‘#’压入OPTR栈中
	scanf("%c",&N);							//从键盘中读入字符
	TOP_1=OPND->next;						//将TOP_1设置为数据栈的栈顶
	TOP_2=OPTR->next;						//将TOP_2设置为运算符栈的栈顶

	while(N!='#') {
		if(N>='0'&&N<='9') {
			if(flag==0) {
				Push(N,OPND,i);
				flag=1; 
			} else {
				i++;
				Push(N,OPND,i);
			}
		} else if(N=='+'||N=='-'||N=='*'||N=='/'||N=='#') {
			i=1;
			flag=0;
			W=Compare(TOP_2->Data,N);
			switch(W) {
				case'<': {
					Push(N,OPTR,1);
					break;
				}
				case'>': {
					M=Pop(OPTR);
					TOP_1=OPND->next;
					i=TOP_1->Number;
					A=0;
					a=0;
					for(j=0; j<i; j++) {
						a=Pop(OPND)-'0';
						A=a*pow(10,j)+A;
					}
					TOP_1=OPND->next;
					i=TOP_1->Number;
					B=0;
					b=0;
					for(j=0; j<i; j++) {
						b=Pop(OPND)-'0';
						B=b*pow(10,j)+B;
					}
					C=operate(B,M,A);
					D=C;
					E=0;
					do {
						E++;
						F[E]=D%10;
						D=D/10;
					} while(D!=0);
					for(j=E; j>0; j--) {
						Push(F[j]+'0',OPND,E);
					}
					TOP_2=OPTR->next;
					if(TOP_2->Data=='#') {
						Push(N,OPTR,1);
						i=1;
					} else {						//还有BUG
						W=Compare(TOP_2->Data,N);
						switch(W) {
							case'<': {
								Push(N,OPTR,1);
								break;
							}
							case'>': {
								M=Pop(OPTR);
								i=TOP_1->Number;
								A=0;
								a=0;
								for(j=0; j<i; j++) {
									a=Pop(OPND)-'0';
									A=a*pow(10,j)+A;
								}
								TOP_1=OPND->next;
								i=TOP_1->Number;
								B=0;
								b=0;
								for(j=0; j<i; j++) {
									b=Pop(OPND)-'0';
									B=b*pow(10,j)+B;
								}
								C=operate(B,M,A);
								D=C;
								E=0;
								do {
									E++;
									F[E]=D%10;
									D=D/10;
								} while(D!=0);
								for(j=E; j>0; j--) {
									Push(F[j]+'0',OPND,E);
								}
								TOP_2=OPTR->next;
								if(TOP_2->Data=='#') {
									Push(N,OPTR,1);
									i=1;
								} else {						//还有BUG
									W=Compare(TOP_2->Data,N);
									M=Pop(OPTR);
									i=TOP_1->Number;
									A=0;
									a=0;
									for(j=0; j<i; j++) {
										a=Pop(OPND)-'0';
										A=a*pow(10,j)+A;
									}
									TOP_1=OPND->next;
									i=TOP_1->Number;
									B=0;
									b=0;
									for(j=0; j<i; j++) {
										b=Pop(OPND)-'0';
										B=b*pow(10,j)+B;
									}
									C=operate(B,M,A);
									D=C;
									E=0;
									do {
										E++;
										F[E]=D%10;
										D=D/10;
									} while(D!=0);
									for(j=E; j>0; j--) {
										Push(F[j]+'0',OPND,E);
									}
									Push(N,OPTR,1);
								}
								break;
							}
							default:
								printf("error");
								break;
						}
						i=1;
					}
					break;
				}
				default:
					printf("error");
					break;
			}
		}
		TOP_1=OPND->next;
		TOP_2=OPTR->next;
		scanf("%c",&N);
	}
	TOP_1=OPND->next;
	M=Pop(OPTR);
	i=TOP_1->Number;
	A=0;
	a=0;
	for(j=0; j<i; j++) {
		a=Pop(OPND)-'0';
		A=a*pow(10,j)+A;
	}
	TOP_1=OPND->next;
	i=TOP_1->Number;
	B=0;
	b=0;
	for(j=0; j<i; j++) {
		b=Pop(OPND)-'0';
		B=b*pow(10,j)+B;
	}
	C=operate(B,M,A);
	D=C;
	E=0;
	do{
		E++;
		F[E]=D%10;
		D=D/10;
	} while(D!=0);
	for(j=E; j>0; j--) {
		Push(F[j]+'0',OPND,E);
	}
	TOP_2=OPTR->next;
	if(TOP_2->Data=='#') {
		return OPND;
	} else {
		W=Compare(TOP_2->Data,N);
		M=Pop(OPTR);
		i=TOP_1->Number;
		A=0;
		a=0;
		for(j=0; j<i; j++) {
			a=Pop(OPND)-'0';
			A=a*pow(10,j)+A;
		}
		TOP_1=OPND->next;
		i=TOP_1->Number;
		B=0;
		b=0;
		for(j=0; j<i; j++) {
			b=Pop(OPND)-'0';
			B=b*pow(10,j)+B;
		}
		C=operate(B,M,A);
		D=C;
		E=0;
		do {
			E++;
			F[E]=D%10;
			D=D/10;
		} while(D!=0);
		for(j=E; j>0; j--) {
			Push(F[j]+'0',OPND,E);
		}
		return OPND;
	}
}

int main() {
	int B=0,b,j,i;
	Stack OPTR,OPND,TOP_1;
	OPTR=CreateStack(OPTR);
	OPND=CreateStack(OPND);
	OPND=OP(OPTR,OPND);
	TOP_1=OPND->next;
	i=TOP_1->Number;
	for(j=0; j<i; j++) {
		b=Pop(OPND)-'0';
		B=b*pow(10,j)+B;
	}
	printf("%d",B);
	return 0;
}

运行结果:

 

  • 24
    点赞
  • 208
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值