/******检查堆栈是否为空******/
int IsEmpty(Stack S)
{
return(S->Next==NULL);
}
/******检查float堆栈是否为空******/
int FIsEmpty(FStack S)
{
return(S->Next==NULL);
}
/******弹出栈顶元素******/
void Pop(Stack S)
{
PtrToNode FirstCell;
if (IsEmpty(S))
perror("Empty Stack");
else{
FirstCell = S->Next;
S->Next = S->Next->Next;
free(FirstCell);
}
}
/******弹出float栈顶元素******/
void FPop(FStack S)
{
Ptr_Fn FirstCell;
if (FIsEmpty(S))
perror("Empty Stack");
else{
FirstCell = S->Next;
S->Next = S->Next->Next;
free(FirstCell);
}
}
/******将堆栈置空******/
void MakeEmpty(Stack S)
{
if (S == NULL)
perror("Must use Createstack first");
else
while (!IsEmpty(S))
Pop(S);
}
/******将float堆栈置空******/
void FMakeEmpty(FStack S)
{
if (S == NULL)
perror("Must use Createstack first");
else
while (!IsEmpty(S))
Pop(S);
}
/******元素进栈******/
void Push(char X, Stack S)
{
PtrToNode TmpCell;
TmpCell = (PtrToNode)malloc(sizeof(struct Node));
if (TmpCell == NULL)
perror("Out of Space!");
else{
TmpCell->Element = X;
TmpCell->Next = S->Next;
S->Next = TmpCell;
}
}
/******float元素进栈******/
void FPush(float X, FStack S)
{
Ptr_Fn TmpCell;
TmpCell = (Ptr_Fn)malloc(sizeof(struct FNode));
if (TmpCell == NULL)
perror("Out of Space!");
else{
TmpCell->Element = X;
TmpCell->Next = S->Next;
S->Next = TmpCell;
}
}
/******返回栈顶元素******/
char Top(Stack S)
{
if (!IsEmpty(S))
return S->Next->Element;
perror("Empty Stack");
exit(1);
return 0;
}
/******返回float栈顶元素******/
float FTop(FStack S)
{
if (!FIsEmpty(S))
return S->Next->Element;
perror("Empty Stack");
exit(1);
return 0;
}
/******将堆栈元素倒置******/
void Reverse(Stack Rev)
{
Stack Tempstack;
Tempstack = malloc(sizeof(struct Node));
Tempstack->Next = NULL;
while (!IsEmpty(Rev)){
Push(Top(Rev),Tempstack); /*将元素压栈到一个临时堆栈*/
Pop(Rev);
}
Rev->Next = Tempstack->Next; /*指向新的堆栈*/
}
/*******
Whereat 说明:
Whereat 记录了操作数和运算符号的位置,用A和B区分。A = operand, B = operator.
(例如 1+2转换成12+,在whereat中的形式应该是 AAB)
OpHolder说明:
Char类型的堆栈Opholder用来保存运算符号。
******/
/******将中缀表带式转换为后缀表达式******/
void ConvertToPost(FILE *In, Stack Whereat, FILE *Temp)
{
Stack OpHolder;
char holder;
char lastseen;
int digitcounter = 0; &nb