資源簡介
c語言實現中綴表達式轉后綴表達式并求得計算結果,用順序棧結構。
當輸入者輸入錯誤信息的時候需要報錯,并說明錯誤的種類。
代碼片段和文件信息
#include?“stdio.h“
#include?“malloc.h“
#include?“string.h“
#include?“stdlib.h“
#define?ERROR?0
#define?SIZE?100
int?temp=0;
int?error=0;
typedef?struct
{
char?data[SIZE];
int?top;
int?base;
}slink_c;
typedef?struct
{
double?data[SIZE];
int?top;
int?base;
}slink_d;
void?Initstack_c(slink_c?*s)
{
s->top?=?0;
s->base?=?0;
}
void?Initstack_d(slink_d?*s)
{
s->top?=?s->base?=?0;
}
int?Emptystack_c(slink_c?*s)
{
if(s->top?==?s->base)
return(1);
else
return(0);
}
int?Emptystack_d(slink_d?*s)
{
if(s->top?==?s->base)
return(1);
else
return(0);
}
char?Pop_c(slink_c?*s)
{
char?e;
if(s->data[s->top]==‘#‘)
return?ERROR;
else
{
e=s->data[s->top-1];
s->top--;
}
return?e;
}
double?Pop_d(slink_d?*s)
{
double?e;
if(s->base?==?s->top)
return?ERROR;
else
{
e=s->data[s->top-1];
s->top--;
}
return?e;
}
void?Push_c(slink_c?*s?char?e)
{
s->data[s->top]=e;
s->top++;
}
void?Push_d(slink_d?*s?double?e)
{
s->data[s->top]=e;
s->top++;
}
char?Gettop_c(slink_c?*s)
{
if(s->top?==?s->base)
return?ERROR;
return?(s->data[s->top-1]);
}
double?Gettop_d(slink_d?*s)
{
if(s->top?==?s->base)
return?ERROR;
return?(s->data[s->top-1]);
}
//判斷是不是一個數字
bool?IsNumber(char?x)
{
if(x?==?‘0‘?||?x?==?‘1‘?||?x?==?‘2‘?||?x?==?‘3‘?||?x?==?‘4‘?||?x?==?‘5‘?||?x?==?‘6‘?||?x?==?‘7‘?||?x?==?‘8‘?||?x?==?‘9‘)
return?(true);
else
return?(false);
}
//判斷是不是一個符號
bool?IsOperator(char?x)
{
if(x?==?‘+‘?||?x?==?‘-‘?||?x?==?‘*‘?||?x?==?‘/‘?||?x?==?‘(‘?||?x?==?‘)‘||?x?==?‘#‘)
return?(true);
else
return?(false);
}
//符號優先級比較
int?Precede?(char?x?char?y)
{
switch(x)
{
case?‘(‘:x=0;break;
case?‘+‘:
case?‘-‘:x=1;break;
case?‘*‘:
case?‘/‘:x=2;break;
}
switch(y)
{
case?‘+‘:
case?‘-‘:y=1;break;
case?‘*‘:
case?‘/‘:y=2;break;
case?‘(‘:y=3;break;
}
if?(x?>=?y)
return?(1);
else
return?(0);
}
//中綴轉后綴
void?mid_post(char?post[]?char?mid[])
{
slink_c?s1;
int?i=0?j=0;
char?ch;
Initstack_c(&s1);
Push_c(&s1‘#‘);
if(mid[i]?==?‘\0‘)
{
error?=?1;
printf(“輸入錯誤\n“);
return;
}
while(mid[i]!=‘\0‘)
{
if(IsNumber(mid[i]))
{
while((mid[i]?>=?‘0‘&&mid[i]?<=?‘9‘)||mid[i]?==?‘.‘)
{
post[j++]?=?mid[i];
temp++;
i++;
}
post[j++]?=?‘?‘;
temp++;
}
else?if(IsOperator(mid[i]))
{
switch(mid[i])
{
case?‘(‘:
{
i++;
if(mid[i]?==?‘-‘)
{
while(mid[i]?!=?‘)‘)
{
post[j++]?=?mid[i];
i++;
temp++;
}
post[j++]?=?‘?‘;
i++;
temp++;
}
else
{
i--;
Push_c(&s1mid[i]);
i++;
}
}break;
case?‘)‘:
{
ch?=?Pop_c(&s1);
do
- 上一篇:md5加密算法 C語言經過測試驗證完整版
- 下一篇:學分管理系統 c++
評論
共有 條評論