数据结构第三次上机 第三章之链栈

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Haruno_Sakura/article/details/78446217
实验题2:实现链栈的各种基本运算的算法

内容: 编写一个程序listack.cpp,实现链栈的各种基本运算,并在此基础上设计一个程序exp3-2.cpp,完成如下功能:

(1)初始化栈s。

 (2)判断栈s是否非空

 (3)依次进栈元素a,b,c,d,e;

 (4)判断栈S是否非空。

 (5)输出出栈序列

  (6)判断栈S是否非空。

(7) 释放栈。

代码:

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef int ElemType;                           //自定义类型;
typedef struct linknode
{
    ElemType data;                                      //数据域
    struct linknode *next;                              //指针域
}LinkStNode;                                            //链栈节点类型;
//初始化栈其实是创建链栈的头节点,并将next域置为NULL;
void InitStack(LinkStNode*&s)                     //初始化栈;
{
    s=(LinkStNode *)malloc(sizeof(LinkStNode));
    s->next=NULL;
}
//该运算释放链栈S占用的全部节点空间,和单链表的销毁算法完全相同;
void DestroyStack(LinkStNode *&s)                  //销毁栈
{
    LinkStNode *pre=s,*p=s->next;                   //pre指向头结点,p指向首节点
    while(p!=NULL)                                  //扫描链栈s,当P不为空时循环;
    {
        free(pre);                                  //释放pre节点;
        pre=p;                                      //pre 和 p 同时后移一个节点;
        p=pre->next;
    }
    free(pre);                                      //循环结束时p为NULL,pre 指向尾节点,释放他;
}
//栈的四要素:栈为空的条件:s->next==NULL是否成立;
bool StackEmpty(LinkStNode *s)                     //判断栈是否为空
{
    return (s->next==NULL);
}
//该运算新建一个节点,用于存放元素e(由p指向他,然后将其插入头结点后作为新的首节点;
bool Push(LinkStNode *&s,ElemType e)               //进栈
{
    LinkStNode *p;                                 //新建节点p
    p=(LinkStNode *)malloc(sizeof(LinkStNode));
    p->data=e;                                     //存放元素e;
    p->next=s->next;                               //将p节点插入作为首节点;
    s->next=p;
}
//在栈不为空的条件下,提取首节点的数据域赋予给引用型参数e,然后将其删除;
bool Pop(LinkStNode *&s,ElemType &e)               //出栈
{
    LinkStNode *p;
    if(s->next==NULL)                               //栈空情况;
        return false;
    p=s->next;                                      //p指向首节点
    e=p->data;                                      //提取首节点值;
    s->next=p->next;                                //删除首节点
    free(p);                                        //释放被删节点的存储空间;
    return true;                                    //返回真;
}
int main()
{
    LinkStNode *s;
    ElemType e;
    printf("栈链的各种基本运算算法如下: \n\n");
    printf("    (1).初始化栈S:\n");
    InitStack(s);
    printf("    (2).判断栈s是否非空: %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是否非空: %s\n",StackEmpty( s)?"空":"非空");
    printf("    (5).输出出栈序列:" );
    while(!StackEmpty(s))
    {
        Pop(s,e);
        printf("%c ",e);
    }
    printf("\n");
    printf("    (6).判断栈s是否非空: %s\n",StackEmpty(s)?"空":"非空");
    printf("    (7).释放栈\n");
	DestroyStack(s);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Haruno_Sakura/article/details/78446217
今日推荐