数据结构与算法分析--c语言描述(原书第二版)练习自答(第三章)(3.18~3.26)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值