实现这个算法首先要定义两个结构体,一个结点结构体,一个栈结构体,然后就是一系列的基本操作,初始化入栈出栈,核心部分就是两个,一个就是运算符的优先级,需要分情况讨论;另一个就是出入栈问题,既要兼顾优先级又要兼顾括号匹配,有进栈不运算、进栈运算 、出栈不运算、出栈运算几种情况。具体请看代码:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef struct node
{
int data;
struct node *next;
}Node;
typedef struct stack
{
Node *top;
int count;
}Stack;
int InitStack(Stack *S)
{
S->top = NULL;
S->count = 0;
return OK;
}
int EmptyStack(Stack *S)
{
return (S->count == 0) ? OK : ERROR;
}
int Push(Stack *S, int e)
{
Node *p = (Node *)malloc(sizeof(Node));
if(p == NULL)
{
return ERROR;
}
p->data = e;
p->next = S->top;
S->top = p;
S->count++;
return OK;
}
int GetTop(Stack *S)
{
if(NULL == S->top)
return ERROR;
return (S->top->data);
}
int Priority(char s)
{
switch(s)
{
case '(':
return 3;
case '*':
case '/':
return 2;
case '+':
case '-':
return 1;
default :
return 0;
}
}
int Pop(Stack *S)
{
int e;
if (NULL == S->top)
return ERROR;
Node *p = S->top;
e = p->data;
S->top = p->next;
free(p);
S->count--;
return e;
}
int main()
{
Stack num, opt;
char str[100] = {0};
int i = 0, tmp = 0, j;
if (InitStack(&num) != OK || InitStack(&opt) !=OK)
{
printf("Init Failure!\n");
exit(1);
}
printf("请输入你想要的操作:\n");
scanf("%s", str);
while (str[i] != '\0' || EmptyStack(&opt) != OK)
{
if(str[i] >= '0' && str[i] <= '9')
{
tmp = tmp *10 + str[i] -'0';
i++;
if(str[i] < '0' || str[i] > '9')
{
Push(&num, tmp);
tmp = 0;
}
}
else
{
if((EmptyStack(&opt) == OK) || (GetTop(&opt) == '(' && str[i] != ')') ||
Priority(str[i]) > Priority(GetTop(&opt)))
{
Push(&opt, str[i]);
i++;
continue;
}
if (GetTop(&opt) == '(' && str[i] == ')')
{
Pop(&opt);
i++;
continue;
}
if ((str[i] != '\0' && EmptyStack(&opt) != OK) || (str[i] == ')' && GetTop(&opt)!= '(') ||
Priority(str[i]) <= Priority(GetTop(&opt)))
{
switch (Pop(&opt))
{
case '+':
Push(&num, Pop(&num) + Pop(&num));
break;
case '-':
j = Pop(&num);
Push(&num, Pop(&num) - j);
break;
case '*':
Push(&num, Pop(&num) * Pop(&num));
break;
case '/':
j = Pop(&num);
Push(&num, Pop(&num) / j);
break;
}
continue;
}
}
}
printf("result is:%d\n",Pop(&num));
}