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

📄 jisuanqi3.c

📁 利用数据结构栈的思想
💻 C
字号:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define MAX 1024
int precede(char oper1, char oper2){
	switch(oper1){
		case '+':
			switch(oper2){
				case '+': case '-': case ')': case'#': case '=': return 1;
				case '*': case '/': case '(': case '^': return -1;
				default: break;
			}
			break;
		case '-':
			switch(oper2){
				case '+': case '-': case ')': case '#': case '=': return 1;
				case '*': case '/': case '(': case '^': return -1;
				default: break;
			}
			break;
		case '*':
			switch(oper2){
				case '+': case '-': case '*': case '/': case ')': case '#': case '=': return 1;
				case '(': case '^': return -1;
				default: break;
			}
			break;
		case '/':
			switch(oper2){
				case '+': case '-': case '*': case '/': case ')': case '#': case '=': return 1;
				case '(': case '^': return -1;
				default: break;
			}
			break;
		case '(':
			switch(oper2){
				case '+': case '-': case '*': case '/': case '(': case '^': return -1;
				case ')': return 2;
				default: break;
			}
			break;
		case ')':
			switch(oper2){
				case '+': case '-': case '*': case '/': case ')': case '#': case '^': case '=': return 1;
				default: break;
			}
			break;
		case '^':
			switch(oper2){
				case '+': case '-': case '*': case '/': case ')': case '#': case '=': return 1;
				case '(': case '^': return -1;
				default: break;
			}
			break;
		case '#':
			switch(oper2){
				case '+': case '-': case '*': case '/': case '(': case '^': return -1;
				case '=': return 0;
				default: break;
			}
			break;
		default: break;
	}
	return -2;
}
int main()
{
	char oper[MAX], str[MAX], c, tmp[100], op;
	long num[MAX]; 
	int i, k, cmp;
	int opcnt, ncnt, flag, cop;
	long a, b;

	while(gets(str)){
		if(strcmp(str, "") == 0) break;

		memset(oper, 0, MAX);
		memset(num, 0, MAX*sizeof(long));
		
		flag = opcnt = ncnt = cmp = cop = 0;
		oper[opcnt++] = '#';
		k = 0;
		c = str[k++];
		while(flag == 0){
			if(c == ' '){
				c = str[k++];
				continue;
			}
			if(c <= '9' && c >= '0'){     /*获取操作数并入栈,栈顶上移*/ 
				tmp[0] = c;
				for(i = 1;(c = str[k++]) != '\n' && c != EOF;i++){
					if(c >= '0' && c <= '9'){
						tmp[i] = c;
					}else{
						break;
					}
				}
				tmp[i] = '\0';
				num[ncnt++] = atol(tmp);
			}else{
				cop = 0;
				while(flag == 0 && cop == 0){
					if(c != '\n' && c != EOF && c != '\0'){
						op = c;
					}
					switch((cmp = precede(oper[opcnt-1], op))){
						case 1:
							a = num[ncnt-2];             /*操作数出栈*/ 
							b = num[ncnt-1];
							switch(oper[opcnt-1]){
								case '+':
									num[ncnt-2] = a + b;
									break;
								case '-':
									num[ncnt-2] = a - b;
									break;
								case '*':
									num[ncnt-2] = a * b;
									break;
								case '/':
									num[ncnt-2] = a / b;
									break;
								case '^':
									num[ncnt-2] = (long)pow(a, b);
									break;
								default:
									break;
							}
							opcnt--;                     /*栈顶下移*/ 
							ncnt--;
							break;
						case -1: 
							oper[opcnt++] = op;   /*操作符号入栈,栈顶上移*/ 
							c = str[k++];
							cop = 1;
							break;
						case 2: 
							opcnt--;              /*脱括号,操作符号栈顶下移*/ 
							c = str[k++];
							cop = 1;
							break;
						case 0:
							flag = 1;
							break;
						default: break;
					}
				}
			}
		}
		printf("%ld\n", num[0]);
	}
	return 0;
}

⌨️ 快捷键说明

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