程序摘抄自黄国瑜的数据结构
/*program name:stack_expre.c
function:input the expression and caculatte the value
data:13-8-4
author:tt
*/
#include <stdio.h>
#include <stdlib.h>
/*defines a structure type*/
struct s_node
{
int data;
struct s_node *next;
};
typedef struct s_node s_list;
typedef s_list *link;
link operator=NULL;
link operand=NULL;
/*push the data in the stack*/
link push(link stack,int value)
{
link newnode;
newnode=(link)malloc(sizeof(s_list));
if(!newnode){
printf("\nmemory allocation failure!");
return NULL;
}
newnode->data=value;
newnode->next=stack;
stack=newnode;
return stack;
}
/*take the data out of the stack*/
link pop(link stack,int *value)
{
link top;
if(stack!=NULL){
top=stack;
stack=stack->next;
*value=top->data;
free (top);
return stack;
}
else *value=-1;
return NULL;
}
/*check the stack whether is empty*/
int empty(link stack)
{
if(stack==NULL)
return 1;
else
return 0;
}
/*determine the input whether is operator */
int is_operator(char operator)
{
switch (operator)
{
case '+': case '-': case '/': case '*':return 1;
default :return 0;
}
}
/*determine the priority of the operators*/
int priority(char operator)
{
switch (operator)
{
case '+': case '-':return 1;
case '/': case '*':return 2;
default : return 0;
}
}
/*calculation result of two numbers*/
int two_reuslt (int operator ,int operand1,int operand2)
{
switch (operator){
case '+': return (operand2 + operand1);
case '-': return (operand2 - operand1);
case '*': return (operand2 * operand1);
case '/': return (operand2 / operand1);
}
}
int main(void)
{
char expression[50];
int position =0;
int op=0;
int operand1=0;
int operand2=0;
int evaluate=0;
printf("input the inorder expression:");
fgets(expression,50,stdin);
printf("%s\n",expression);
while(expression[position]!='\0'&& expression[position]!='\n'){
if(is_operator(expression[position])){
if(!empty(operator)){
while(!empty(operator)&&priority(expression[position])<=priority(operator->data)){
operand=pop(operand,&operand1);
operand=pop(operand,&operand2);
operator=pop(operator,&op);
operand=push(operand,two_reuslt(op,operand1,operand2));
}
}
operator=push(operator,expression[position]);
position++;
}
else{
operand=push(operand,expression[position]-48);
position++;
}
}
while(!empty(operator)){
operator=pop(operator,&op);
operand=pop(operand,&operand1);
operand=pop(operand,&operand2);
operand=push(operand,two_reuslt(op,operand1,operand2));
}
operand=pop(operand,&evaluate);
printf("the expression result is '%d'",evaluate);
return 0;
}
1.开始程序为判断。语句为:
while(priority(expression[position])<=priority(operator->data)&&empty(operator))
前面的运算符小于后边的运算符时都是正确的,大于等于时都错了。在执行2+6-4时出现段错误.在执行到处理“-”时,判断“-”和“+”的优先级,结果是相等且此时操作符栈不为空。条件满足执行2+6,此时符号的堆已经为空。而程序还会再判断符号的优先级,在执行到operator->data是就会报段错误。修改后将!empty(operator)提到前面。2.程序开始出现的错误如下:
这两个错误是相关联的,下图显示的是相关的函数没有实现。导致在函数的引用时发生错误。error:在调用时把函数名写错了。
3.gets函数存在bug,修改成fgets()函数。
.
4.在执行时出现了非法指针。具体原因没找到。重新输了一遍程序,就好了。需要继续解决~~~
解决问题的过程能掌握很多新知识,发现问题,就想办法解决问题,就像美白不留死角~~~