3.18
stack.h
#ifndef _Stack_H
#define _Stack_H
#define symbolsize 10
struct Node;
typedef char *ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
int IsEmpty(Stack S);
Stack CreateStack(void);
void MakeEmpty(Stack S);
void Push(ElementType X,Stack S);
ElementType Top(Stack S);
void Pop(Stack S);
#endif
stack.c
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
struct Node
{
ElementType Element;
PtrToNode Next;
};
static void FatalError(char *S);
static void Error(char *S);
static void FatalError(char *S)
{
fputs(S,stderr);
exit(EXIT_FAILURE);
}
static void Error(char *S)
{
fputs(S,stderr);
}
int IsEmpty(Stack S)
{
return S->Next==NULL;
}
Stack CreateStack(void)
{
Stack S;
S=malloc(sizeof(struct Node));
if(S==NULL)
FatalError("Out of space!");
S->Element=malloc(sizeof(char)*symbolsize);
if(S->Element==NULL)
FatalError("Out of space!");
S->Next=NULL;
MakeEmpty(S);
return S;
}
void MakeEmpty(Stack S)
{
if(S==NULL)
Error("Must usr CreateStack first.");
else
while(!IsEmpty(S))
Pop(S);
}
void Push(ElementType X,Stack S)
{
PtrToNode Tmp;
Tmp=malloc(sizeof(struct Node));
if(Tmp==NULL)
FatalError("Out of space!");
Tmp->Element=malloc(sizeof(char)*symbolsize);
if(Tmp->Element==NULL)
FatalError("Out of space!");
strcpy(Tmp->Element,X);
Tmp->Next=S->Next;
S->Next=Tmp;
}
ElementType Top(Stack S)
{
if(!IsEmpty(S))
return S->Next->Element;
Error("Empty stack!");
return 0;
}
void Pop(Stack S)
{
PtrToNode P;
if(IsEmpty(S))
Error("Empty stack!");
else
{
P=S->Next;
S->Next=S->Next->Next;
free(P->Element);
free(P);
}
}
test.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "stack.h"
int main(void)
{
FILE *fp;
Stack S;
char string[symbolsize],string_tmp[symbolsize];
S=CreateStack();
fp=fopen("text","r");
while(fscanf(fp,"%s",string)!=EOF)
{
if(strcmp(string,"begin")==0||strcmp(string,"(")==0||strcmp(string,"[")==0||strcmp(string,"{")==0||strcmp(string,"/*")==0)
Push(string,S);
else if(strcmp(string,"end")==0||strcmp(string,"*/")==0||strcmp(string,")")==0||strcmp(string,"]")==0||strcmp(string,"}")==0)
{
if(IsEmpty(S))
{
puts("Empty stack!Error symbol!");
exit(EXIT_FAILURE);
}
strcpy(string_tmp,Top(S));
if(strcmp(string_tmp,"begin")==0)
strcpy(string_tmp,"end");
if(strcmp(string_tmp,"(")==0)
strcpy(string_tmp,")");
if(strcmp(string_tmp,"/*")==0)
strcpy(string_tmp,"*/");
if(strcmp(string_tmp,"[")==0)
strcpy(string_tmp,"]");
if(strcmp(string_tmp,"{")==0)
strcpy(string_tmp,"}");
if(strcmp(string,string_tmp)==0)
Pop(S);
else
{
puts("Symbol is not matched!Error!");
exit(EXIT_FAILURE);
}
}
else
break;
}
if(!IsEmpty(S))
{
puts("File scan done!Symbol is not matched!");
exit(EXIT_FAILURE);
}
puts("Check over!Symbol matched!");
fclose(fp);
return 0;
}
3.19
stack.h
#ifndef _Stack_H
#define _Stack_H
#define NumberLength 10
struct Node;
typedef char *ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
int IsEmpty(Stack S);
Stack CreateStack(void);
void MakeEmpty(Stack S);
void Push(ElementType X,Stack S);
ElementType Top(Stack S);
void Pop(Stack S);
#endif
stack.c
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
struct Node
{
ElementType Element;
PtrToNode Next;
};
static void FatalError(char *S);
static void Error(char *S);
static void FatalError(char *S)
{
fputs(S,stderr);
exit(EXIT_FAILURE);
}
static void Error(char *S)
{
fputs(S,stderr);
}
int IsEmpty(Stack S)
{
return S->Next==NULL;
}
Stack CreateStack(void)
{
Stack S;
S=malloc(sizeof(struct Node));
if(S==NULL)
FatalError("Out of space!");
S->Element=malloc(sizeof(char)*NumberLength);
if(S->Element==NULL)
FatalError("Out of space!");
S->Next=NULL;
MakeEmpty(S);
return S;
}
void MakeEmpty(Stack S)
{
if(S==NULL)
Error("Must usr CreateStack first.");
else
while(!IsEmpty(S))
Pop(S);
}
void Push(ElementType X,Stack S)
{
PtrToNode Tmp;
Tmp=malloc