|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<stdio.h>
#define ERROR 0
#define OK 1
//定义顺序栈
typedef struct{
char stack[100]; // 定义存储空间为100
int top;//栈顶指针 起始值为0新增一个数栈顶 均加1
}SqStack;
//顺序栈初始化
void InitStack(SqStack *S){
S->top=0;//把栈顶指针位置为0
}
//进栈操作
int PushStack(SqStack *S,char e){
if(S->top >= 100) //进栈前 ,判断是否栈已经满了 最大为100
{
printf("栈已满,进栈失败\n");
return ERROR;
}else{
S->stack[S->top]=e;
S->top++;
return OK;
}
}
//出栈操作
int PopStack(SqStack *S,char *e){
if(S->top==0)
{
printf("栈已经没有元素,不能出栈");// 出栈时,栈空
return ERROR;
}else{
S->top--;
*e=S->stack[S->top];
return OK;
}
}
//取栈顶元素
int GetTop(SqStack S,char *e)
{
if(S.top<=0)
{
printf("栈已经空\n");//栈空
return ERROR;
}else{
*e=S.stack[S.top-1];
return OK;
}
}
int StackEmpty(SqStack S) //判断栈是否为空
{
if(S.top==0){
return OK;
} else{
return ERROR;
}
}
//中缀表达式转换成后缀表达式
void PostExpress(char str[],char exp[]){
SqStack S; // 数字 符号
InitStack(&S);
char ch;
char e;//取栈顶元素比较
int i=0,j=0;
ch=str[i]; //获取输入的数或符号
i++;//用于获得下一个
while(ch!='\0') //不为空 NULL
{
//case 进栈均是 算术符号 数字直接出栈
switch(ch)
{
case '(':
PushStack(&S,ch);//进栈操作
break;
case ')' :
while(GetTop(S,&e)&&e!='(')//取栈顶元素,当栈顶不为 左括号时 接着向下取
{
PopStack(&S,&e);//弹出
exp[j]=e;//将出栈元素 非左括号 放到 数组exp[]中
j++;
}
PopStack(&S,&e);//当遇到(时,将符号插入栈中;当遇到)时,将(取出栈 但不用保存在数组中
break;
case '+':
case '-':
while(!StackEmpty(S)&& GetTop(S,&e)&&(e!='('))// S不为空 取S中的栈顶元素且栈顶元素不为(
{ // 因为出现(时,说明应当先对()内进行运算
PopStack(&S,&e);// 弹出栈顶元素 加减优先级低, 同时如果出现相同优先级的符号时,应当是先进去的先出来
//运算符的优先级小于栈顶运算符的优先级时,将栈顶运算符弹出并输出 没遇到左括号就先算
exp[j]=e; //栈顶元素 放到exp[]
j++;
}
PushStack(&S,ch);//将当前运算符进栈
break;
case '*':
case '/':
while(!StackEmpty(S)&& GetTop(S,&e)&&(!e=='(')) // 乘除优先级 小于左括号 还是有问题 当 x*(y-z) 相遇没结果
{ // 出栈 y z - x *
PopStack(&S,&e);// 弹出栈顶元素
exp[j]=e;
j++;
}
PushStack(&S,ch);//将当前运算符进栈
break;
default:
while(ch>='0'&&ch<='9') // 获得数字 考虑 输入的数字不止一位
{
exp[j]=ch; //b
j++;
ch=str[i]; //a
i++;
}
i--;
exp[j]=' ';
j++;
}
ch=str[i];
i++;
}
while(!StackEmpty(S)) //扫描到中缀表达式的末尾[即扫描结束],若堆栈中还有存留的运算符依次弹出并输出即可。
{
PopStack(&S,&e);
exp[j]=e;
j++;
}
}
typedef struct {
float data[50];
int top;
}OpStack;
//计算后缀表达式
float ComputeExpress(char a[]){
OpStack S;
int i=0,value;
float x1,x2;
float result;//作为返回值
S.top= -1;
while(a[i]!='\0')
{
if(a[i]!=' ' && a[i]>='0'&& a[i]<='9')// 数字部分
{
value=0;
while(a[i]!=' ')// 数字链接在一起 ,为一个整体
{
value=10*value+a[i] -'0'; // ????
i++;
}
S.top++;
S.data[S.top]=value;
}else
{
switch(a[i]) // 符号部分 加减乘除
{
case '+':
x1=S.data[S.top];
S.top--;
x2=S.data[S.top];
S.top--;
result=x1+x2;
S.top++;
S.data[S.top]=result;//将 result 作为数组的元素
break;
case '-':
x1=S.data[S.top];
S.top--;
x2=S.data[S.top];
S.top--;
result=x2-x1;
S.top++;
S.data[S.top]=result;
break;
case '*':
x1=S.data[S.top];
S.top--;
x2=S.data[S.top];
S.top--;
result=x1*x2;
S.top++;
S.data[S.top]=result;
break;
case '/':
x1=S.data[S.top];
S.top--;
x2=S.data[S.top];
S.top--;
result=x2/x1; //需要 float 型 int型 小于1的部分会截去
S.top++;
S.data[S.top]=result;
break;
}//switch
i++;
}
}
if(S.top!=-1){
result=S.data[S.top];
S.top--;
if(S.top==-1)
return result;
else
{
printf("表达式错误");
return ERROR;
}
}
}
int main() {
char a[50],b[50];
float f;
printf("请输入一个算术表达式:\n");
gets(a);//读取字符串
printf("中缀表达式:%s \n" ,a);
PostExpress(a,b);
printf("后缀表达式 %s \n" ,b);
f=ComputeExpress(b);
printf("计算结果: %.2lf \n",f);
return OK;
}
|
|