第一种
/* 此程序的功能是求出用户输入的整形表达式的值*/
/*输入的表达式请用#结尾,比如:2+3+5,应输入:2+3+5#。*/
#include <stdio.h>
#define MAXSIZE 16
typedef struct{
int data[MAXSIZE];
int top;
int base;
}seqstack; /* 顺序栈的定义*/
/*以下为函数声明*/
void InitStack(seqstack *);
int Empty(seqstack *);
void Push(seqstack *, int );
int Pop(seqstack *);
int GetTop(seqstack *);
int Operate(int ,char ,int );
char Proceed(char ,char );
int In(char );
int EvalExpres(void);
/* 定义两个栈分别存放运算符和操作数*/
seqstack StackR,StackD;
/*主函数*/
int main()
{
int v;
char ch;
while(1)
{
printf("end with #,for example 2+3+5 input:2+3+5#/n");
printf("calculate:") ;
v = EvalExpres();
printf("The result is:%d",v);
/*以下为程序控制*/
printf("/nInput 'q' to quit and ENTER run again:");
do{
scanf("%c",&ch);
if(ch == 'q' || ch == 'Q')
exit(0);
}while(ch!='/n');
system("cls");
}
return 0;
}
void InitStack(seqstack *s)
{ s->top = 0;
s->base = 0;
} /* 初始化栈*/
int Empty(seqstack *s)
{ if(s->top == s->base)
return 1;
else
return 0;
} /* 判断栈是否为空*/
void Push(seqstack *s, int x)
{
if(s->top == MAXSIZE)
{ printf("OVER FLOW!/n");
exit(0);
}
else
{ s->data[s->top] = x;
s->top++;
}
} /* 进栈 */
int Pop(seqstack *s)
{ int e;
if(Empty(s))
{ printf("Under flow!/n");
return 0;
} /* 下溢*/
else
{ s->top--;
e = s->data[s->top];
return e;
}
} /* 出栈*/
int GetTop(seqstack *s) /*取栈顶元素*/
{
if(Empty(s))
{ printf("Under flow!/n");
return 0;
}
else
return s->data[s->top-1];
}
int EvalExpres(void) /* 表达式求解函数*/
{
int a,b,i=0,s=0;
char c[80],r;
InitStack(&StackR);
Push(&StackR,'#');
InitStack(&StackD);
printf(" end with #");
gets(c);
while(c[i]!='#' || GetTop(&StackR)!='#')
{
if(!In(c[i])) /* 判断读入的字符不是运算符 是则进栈*/
{ if(c[i] >= '0' && c[i] <= '9')
{
s += c[i]-'0';
while(!In(c[++i])) /*此处实现的功能为当输入的数字为多位数时*/
{ s*=10;
s += c[i]-'0';
}
Push(&StackD,s+'0');
s = 0;
}
else
{
printf("wrong!/n");
return 0;
}
}
else
switch(Proceed(GetTop(&StackR),c[i])) /* 此函数用来比较读取的运算符和栈顶运算符的优先级*/
{
case '<': /* 栈顶的元素优先级高*/
Push(&StackR,c[i]);
i++;
break;
case '=': /* 遇到匹配的小括号时则去掉他*/
Pop(&StackR);
i++;
break;
case '>': /* 栈顶的优先级低则出栈并将结果写入栈内*/