C语言堆栈实现计算器(求后缀表达式)

#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef double status;
typedef char ElemType;
typedef struct SqStack {
	ElemType data[MAXSIZE];
	int top;
}SQTA;
typedef struct SqStack* StackChar;
typedef int ElemTypes;
typedef struct SqStacks {
	ElemTypes data[MAXSIZE];
	int top;
}SQTAs;

typedef struct SqStacks* StackInt;
int begin();
int transform(char expression[]);
int count(char expressionChar[], int expressionInt[]);


int transform(char expression[]) {

	char expressionChar[100] = {};
	int expressionInt[100] = {};
	char* p = expression;
	int a = 0;
	int index = 0;
	int flag = 1;
	StackChar zc = (StackChar)malloc(sizeof(SQTA));
	zc->top = -1;

	do {

		if (*p >= 48 && *p <= 57) {
			a *= 10;
			a += *p - 48;
			flag = 1;
		}
		else {
			if (flag == 1) {
				expressionInt[index] = a;
				expressionChar[index] = '!';
				index++;
				a = 0;
			}
			if (*p == NULL) {
				while (zc->top != -1) {
					expressionChar[index] = zc->data[zc->top];
					index++;
					zc->top--;
				}

				break;
			}
			else if (zc->top == -1 || *p == '(') {
				zc->top++;
				zc->data[zc->top] = *p;
			}
			else if (*p == ')') {
				do {
					if (zc->data[zc->top] == '(') {
						zc->top--;
						break;
					}
					else {

						expressionChar[index] = zc->data[zc->top];
						index++;
						zc->top--;
					}
				} while (1);

			}
			else if (*p == '*' || *p == '/') {
				while (zc->top >= 0 && zc->data[zc->top] == '*' || zc->data[zc->top] == '/') {
					expressionChar[index] = zc->data[zc->top];
					index++;
					zc->top--;
				}
				zc->top++;
				zc->data[zc->top] = *p;

			}
			else if (*p == '+' || *p == '-') {
				while (zc->top >= 0 && zc->data[zc->top] != '(') {
					expressionChar[index] = zc->data[zc->top];
					index++;
					zc->top--;
				}

				zc->top++;
				zc->data[zc->top] = *p;

			}

			flag = 0;


		}
		p++;
	} while (1);
	int i = 0;
	printf("\n");
	while (expressionInt[i] != NULL || expressionChar[i] != NULL) {
		if (expressionInt[i] != NULL) {
			printf("%d", expressionInt[i]);

		}
		else if (expressionChar[i] != '!') {
			printf("%c", expressionChar[i]);
		}
		i++;
	}
	printf("\n");

	int counts = 0;
	counts = count(expressionChar, expressionInt);
	return counts;
}
int count(char expressionChar[], int expressionInt[]) {
	int i = 0;
	StackInt zi = (StackInt)malloc(sizeof(SQTAs));
	zi->top = -1;
	int count = 0;
	int count1 = 0, count2 = 0;
	while (expressionInt[i] != NULL || expressionChar[i] != NULL) {
		if (expressionInt[i] != NULL) {
			zi->top++;
			zi->data[zi->top] = expressionInt[i];

		}
		else if (expressionChar[i] != '!') {
			count2 = zi->data[zi->top];
			zi->top--;
			count1 = zi->data[zi->top];
			if (expressionChar[i] == '+') {
				count = count1 + count2;
			}
			else if (expressionChar[i] == '-') {
				count = count1 - count2;
			}
			else if (expressionChar[i] == '*') {
				count = count1 * count2;
			}
			else if (expressionChar[i] == '/') {
				count = count1 / count2;
			}
			zi->data[zi->top] = count;
		}

		i++;
	}
	count = zi->data[zi->top];
	zi->top--;

	return count;
}
int begin() {
	char expression[100] = "";
	printf("请输入您要计算的表达式:\n");
	scanf("%99s", &expression);
	printf("\n后缀表达式:\n");
	printf("\n计算结果是:%d\n\n", transform(expression));
}
int main() {
	while (1) {
		begin();
	}
	return 1;
}

利用堆栈实现计算器,输入表达式,输出后缀表达式以及计算结果。

程序中一个操作符栈以及一个操作数栈,分别用来存储运算符和数字。定义一个大小为N=100的堆栈,如果运算符栈顶等于N-1,则堆栈为满,输入表达式,转化为后缀表达式,把扫描到的字符,依次放入字符栈。对运算数进行同样的压栈和判断字符的优先级,然后对压入堆栈的运算数和运算符进行出栈操作,取出栈顶的运算符和运算数,然后进行计算,最后输出结果;时间复杂度和空间复杂度都为O(n)。

猜你喜欢

转载自blog.csdn.net/weixin_52088967/article/details/125075321