#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#define STACK_INIT_SIZE 100 //栈初始开辟空间大小
#define STACK_INCREMENT 10 //栈追加空间大小
//优先级数组,2表示top>c,1表示top<c,0表示top=c,-1表示错误
int prior[7][7] = { {2,2,1,1,1,2,2},{2,2,1,1,1,2,2},{2,2,2,2,1,2,2},
{2,2,2,2,1,2,2},{1,1,1,1,1,0,-1},{2,2,2,2,-1,2,2},{1,1,1,1,1,-1,0} };
//******************************************************************
// 整形栈的实现
//******************************************************************
//整形栈结构体
typedef struct {
int* base;
int* top;
int size;
}intStack;
//栈初始化
intStack intStack_init()
{
intStack s;
s.base = (int*)malloc(sizeof(int) * STACK_INIT_SIZE);
s.top = s.base;
s.size = STACK_INIT_SIZE;
return s;
}
//入栈
void intPush(intStack* s, int e)
{
if (s->top - s->base >= s->size)
{
s->size += STACK_INCREMENT;
s->base = (int*)realloc(s->base, sizeof(int) * s->size);
}
*s->top = e;
s->top++;
}
//出栈
int intPop(intStack* s)
{
if (s->top != s->base)
{
s->top--;
return *s->top;
}
return -1;
}
//******************************************************************
// 字符栈的实现
//******************************************************************
//字符栈结构体
typedef struct {
char* base;
char* top;
int size;
}charStack;
//栈初始化
charStack charStack_init()
{
charStack s;
s.base = (char*)malloc(sizeof(char) * STACK_INIT_SIZE);
s.top = s.base;
s.size = STACK_INIT_SIZE;
return s;
}
//入栈
void charPush(charStack* s, char e)
{
if (s->top - s->base >= s->size)
{
s->size += STACK_INCREMENT;
s->base = (char*)realloc(s->base, sizeof(char) * s->size);
}
*s->top = e;
s->top++;
}
//出栈
char charPop(charStack* s)
{
if (s->top != s->base)
{
s->top--;
return *s->top;
}
return -1;
}
//得到栈顶元素,但不出栈
char getTop(charStack* s)
{
s->top--;
char temp = *s->top;
s->top++;
return temp;
}
//******************************************************************
// 使用栈结构求解表达式
//******************************************************************
//得到操作符在数组prior中的索引值
int getIndex(char ope)
{
switch (ope)
{
case '+': return 0;
case '-': return 1;
case '*': return 2;
case '/': return 3;
case '(': return 4;
case ')': return 5;
case '#': return 6;
}
}
//求得两个操作数和一个操作符的运算结果
int compute(int operand1, int operand2, char ope)
{
switch (ope)
{
case '+': return operand1 + operand2;
case '-': return operand1 - operand2;
case '*': return operand1 * operand2;
case '/': return operand1 / operand2;
}
}
//由表达式字符串指针,得到下一个操作符或操作数
//得到操作符标记key=0,得到操作数标记key=1
//返回偏移后的字符串指针
char* operand_or_operator(char* p, int* operand, char* ope, int* key)
{
while (*p == ' ') p++; //跳过空格
if (*p >= '0' && *p <= '9') //得到操作数
{
*operand = 0;
int dec = 1; //十进制数位权重
intStack s = intStack_init(); //使用整形栈转化数值
while (*p >= '0' && *p <= '9') //操作数位由高到低依次压入栈中
{
intPush(&s, *p - '0');
p++;
}
while (s.base != s.top) //依次读取栈中操作数各位
{
*operand += intPop(&s) * dec;
dec *= 10;
}
*key = 1;
}
else //得到操作符
{
switch (*p)
{
case '+':*ope = '+'; break;
case '-':*ope = '-'; break;
case '*':*ope = '*'; break;
case '/':*ope = '/'; break;
case '(':*ope = '('; break;
case ')':*ope = ')'; break;
case '#':*ope = '#'; break;
}
p++;
*key = 0;
}
return p;
}
//由表达式字符串得到最终计算结果
int output(char* p)
{
intStack operandStack = intStack_init(); //初始化操作数栈
charStack operatorStack = charStack_init(); //初始化操作符栈
charPush(&operatorStack, '#');
int operand, key, index1, index2;
char ope;
while (operatorStack.base != operatorStack.top) //操作符栈空代表计算结束
{
p = operand_or_operator(p, &operand, &ope, &key);
if (key) //得到操作数
intPush(&operandStack, operand);
else //得到操作符
{
index1 = getIndex(getTop(&operatorStack));
index2 = getIndex(ope);
while (prior[index1][index2] == 2) //top优先级高于c
{
intPush(&operandStack, compute(intPop(&operandStack), intPop(&operandStack), charPop(&operatorStack)));
index1 = getIndex(getTop(&operatorStack));
}
if (prior[index1][index2] == 1) //top优先级低于c
{
charPush(&operatorStack, ope);
}
else if (prior[index1][index2] == 0) //top优先级等于c
{
charPop(&operatorStack);
}
else
{
printf("Enter Error!!!\n");
return 0XFFFFFFFF;
}
}
}
return intPop(&operandStack);
}
//******************************************************************
// 主函数
//******************************************************************
void main()
{
char str[100];
int out;
printf("以#结尾:\n");
cin>> str;
out = output(str);
if (out != 0XFFFFFFFF)
printf("结果等于:\n%d\n\n", out);
}