您的位置:首页 > 理论基础 > 数据结构算法

数据结构中用栈实现表达式的计算

2012-07-20 00:00 429 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STACK_SIZE 64

typedef int datatype;
typedef struct _seq_stack_ {
datatype data[STACK_SIZE];
int top;
int size;
}seqstack;

seqstack *creat_stack(void)
{
seqstack *p = (seqstack *)malloc(sizeof(seqstack));
memset(p,0,sizeof(seqstack));
p->top = -1;
p->size = STACK_SIZE;
return p;
}

void annul_stack(seqstack *stack)
{
if(stack == NULL)
return ;
free(stack);
}

int full_stack(seqstack *stack)
{
if(NULL == stack)
return -1;
return (stack->top >= stack->size - 1);
}

int empty_stack(seqstack *stack)
{
if(NULL == stack)
return -1;
return (stack->top < 0);
}

int  push_stack(seqstack *stack, datatype value)
{
if(NULL == stack)
return -1;
if(full_stack(stack))
return 1;
stack->data[++ stack->top] = value;
return 0;
}

datatype pop_stack(seqstack *stack)
{
if(NULL == stack)
return 0;
if(empty_stack(stack))
return 0;
return stack->data[stack->top --];
}

datatype get_top(seqstack *stack)
{
if(NULL == stack)
return 0;
return stack->data[stack->top];
}

int priority(char opt)
{
switch(opt)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}

datatype comput_data(datatype opd1,datatype opd2,char opt)
{
switch(opt)
{
case '+':
return opd1 + opd2;
case '-':
return opd1 - opd2;
case '*':
return opd1 * opd2;
case '/':
return opd1 / opd2;
default:
return 0;
}
}

void proc_data(seqstack *operand, seqstack*operator, char opt)
{
datatype opd1,opd2,result;
while(!empty_stack(operator) && priority(opt) <= priority(get_top(operator)))
{
opd2 = pop_stack(operand);
opd1 = pop_stack(operand);
result = comput_data(opd1,opd2,pop_stack(operator));
printf("the result is : %d\n",result);

push_stack(operand,result);
}
push_stack(operator,opt);
}

int main()
{
char expr[STACK_SIZE] = {0};
datatype result = 0,
sum = 0;
datatype opd1 = 0,
opd2 = 0;
char *p = expr;

seqstack *operand = creat_stack();
seqstack *operator = creat_stack();

gets(expr);
puts(expr);

while(*p != '\0')
{
if(*p >= '0' && *p <= '9')
{
sum = 0;
while(*p >= '0' && *p <= '9')
sum = sum * 10 + *p ++ - '0';
push_stack(operand,sum);
}
else
proc_data(operand,operator,*p ++);
}
puts("-----------------------");
while(!empty_stack(operator))
{
opd2 = pop_stack(operand);
opd1 = pop_stack(operand);
result = comput_data(opd1,opd2,pop_stack(operator));
push_stack(operand,result);
}
printf("the result is : %d\n",get_top(operand));
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息