实现链栈各种基本运算的算法

it2022-05-05  127

/** *    实验题目: *        实现链栈各种基本运算的算法 *    实验内容: *        编写程序,实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: *    (1)初始化链栈s *    (2)判断链栈s是否非空 *    (3)依次进链栈元素a,b,c,d,e *    (4)判断链栈s是否非空 *    (5)输出链栈长度 *    (6)输出从栈顶到栈底元素 *    (7)输出链栈序列 *    (8)判断链栈s是否非空 *    (9)释放链栈 */

#include <stdio.h> #include <malloc.h>

typedef char ElemType; typedef struct linknode {     ElemType data;                        // 数据域     struct linknode *next;                // 指针域 }LiStack;

/*--------------------------初始化栈s---------------------------*/ void InitStack(LiStack *&s)        // 指针的引用 {     s = (LiStack *)malloc(sizeof(LiStack));     s->next = NULL; }

/*--------------------------释放栈s---------------------------*/ void ClearStack(LiStack *&s) {     LiStack *p = s->next;          while(p != NULL)     {         free(s);         s = p;         p = p->next;     } }

/*--------------------------求栈s的长度---------------------------*/ int StackLength(LiStack *s) {     int i = 0;     LiStack *p;          p = s->next;     while(p != NULL)     {         i++;         p = p->next;     }     return i; }

/*--------------------------判断栈s是否为空栈---------------------------*/ int StackEmpty(LiStack *s) {     return (s->next == NULL);     }

/*--------------------------进栈元素e---------------------------*/ void Push(LiStack *&s, ElemType e) {     LiStack *p;          p = (LiStack *)malloc(sizeof(LiStack));     p->data = e;     p->next = s->next;     s->next = p; }

/*--------------------------出栈一个元素---------------------------*/ int Pop(LiStack *&s, ElemType &e) {     LiStack *p;          if(s->next == NULL)                // 栈空的情况         return 0;     p = s->next;                    // p指向第一个数据结点     e = p->data;                         s->next = p->next;     free(p);     return 1; }

/*--------------------------取栈顶元素---------------------------*/ int GetTop(LiStack *s, ElemType &e) {     if(s->next == NULL)                // 栈空的情况         return 0;          e = s->next->data;     return 1; }

/*--------------------------从栈顶到栈底输出元素---------------------------*/ void DispStack(LiStack *s) {     LiStack *p = s->next;          while(p != NULL)     {         printf("%c ", p->data);         p = p->next;     }     printf("\n"); }

int main(void) {     ElemType e;     LiStack *s;          printf("(1)初始化链栈s\n");     InitStack(s);     printf("(2)链栈为%s\n", (StackEmpty(s) ? "空" : "非空"));     printf("(3)依次进链栈元素a,b,c,d,e\n");     Push(s, 'a');     Push(s, 'b');     Push(s, 'c');     Push(s, 'd');     Push(s, 'e');     printf("(4)链栈为%s\n", (StackEmpty(s) ? "空" : "非空"));     printf("(5)链栈长度:%d\n", StackLength(s));     printf("(6)从链栈顶到链栈底元素:");     DispStack(s);     printf("(7)出链栈序列:");     while(!StackEmpty(s))     {         Pop(s, e);         printf("%c ", e);     }     printf("\n");     printf("(8)链栈为%s\n", (StackEmpty(s) ? "空" : "非空"));     printf("(9)释放链栈\n");     ClearStack(s);          return 0; }

测试结果:

(1)初始化链栈s (2)链栈为空 (3)依次进链栈元素a,b,c,d,e (4)链栈为非空 (5)链栈长度:5 (6)从链栈顶到链栈底元素:e d c b a (7)出链栈序列:e d c b a (8)链栈为空 (9)释放链栈


最新回复(0)