数据结构实验-栈的基本操作

提示:本文代码主要是根据 数据结构教程5-李春葆改写的


文章目录

  • 前言
  • 一、实验目的
  • 二、每个功能的具体函数
    • 1.添加栈元素
    • 2.进栈
    • 3.出栈
    • 4.遍历栈
  • 三、实验总代码
  • 总结


前言

书中:
3.13中的栈的链式存储结构及其基本运算的实现(顺序存储结构比较简单,这里不写了)
全文使用C++,比书中的算法更详细点,并且通过主函数实现栈的基本操作了。


一、实验目的

功能:声明栈 ,初始化栈 , 添加栈的元素 , 销毁栈 , 判断栈是否为空 , 进栈 , 出栈 , 取栈顶元素 , 遍历栈 。

二、每个功能的具体函数

提示:这里只写了比较重要的函数

1.添加栈元素

代码如下(示例):

void CreateNode(LinkStNode *&s)
{
    cout << "添加数据,输入-1为结束" << endl;
    ElemType e=0;
    while (true)
    {
        cin >> e;
        if (e == -1)
            break;
        LinkStNode* p;
        p = (LinkStNode*)malloc(sizeof(LinkStNode));  //新建结点p
        p->data = e;                                  //存放元素e
        p->next = s->next;                            //将p节点插入作为首节点
        s->next = p;
        s->length++;
    }
}

2.进栈

代码如下(示例):

void Push(LinkStNode*& s)
{
    cout << "请输入你添加数据" << endl;
    ElemType e;
    cin >> e;
    LinkStNode* p;
    p = (LinkStNode*)malloc(sizeof(LinkStNode));  //新建结点p
    p->data = e;                                  //存放元素e
    p->next = s->next;                            //将p节点插入作为首节点
    s->next = p;
    s->length++;
}

3.出栈

代码如下:

bool Pop(LinkStNode*& s)
{
    LinkStNode* p;
    if (s->next == NULL)    //判断为空的情况
    {
        cout << "栈为空,无需出栈" << endl;
        return false;
    }
    p = s->next;            //p指向首节点
    s->next = p->next;      //删除首节点
    s->length--;
    free(p);                //释放被删除节点的存储空间
    return true;
}

4.遍历栈

代码如下:

void Travers(LinkStNode *&s) {
    LinkStNode* m = s;
    int p = s->length;
    for(int i =0;i<p;i++)
    {
        cout << m->next->data << endl;
        m = m->next;
    }
}

三、实验总代码

#include
#include "栈的基本操作.h"
using namespace std;
typedef int ElemType;

//声明栈
typedef struct linknode
{
    ElemType data;         //数据域
    struct linknode* next; //指针域
    int length;            //长度
}LinkStNode;//指针域类型

//初始化栈
void Init(LinkStNode*& s)
{
    s = (LinkStNode*)malloc(sizeof(LinkStNode));
    s->next = NULL;
    s->length = 0;
}

//销毁栈
void DestroyStack(LinkStNode*& s)
{
    LinkStNode* pre = s, * p = s->next;//pre指向头节点,p指向首节点
    while (p!=NULL)                    //知道p为空
    {
        free(pre);                     //释放pre节点
        pre = p;                       //pre和p同步后移
        p = pre->next;
    }
    free(pre);                         //此时pre指向的尾节点,释放其空间
    cout << "成功销毁栈" << endl;
}

//判断是否为空栈
bool StackEmpty(LinkStNode* s)
{
    if (s->next == NULL)
    {
        cout << "栈为空" << endl;
        return true;
    }
    else
    { 
        cout << "栈不为空" << endl;
        return false;
    } 
}

//进栈
void Push(LinkStNode*& s)
{
    cout << "请输入你添加数据" << endl;
    ElemType e;
    cin >> e;
    LinkStNode* p;
    p = (LinkStNode*)malloc(sizeof(LinkStNode));  //新建结点p
    p->data = e;                                  //存放元素e
    p->next = s->next;                            //将p节点插入作为首节点
    s->next = p;
    s->length++;
}

//出栈
bool Pop(LinkStNode*& s)
{
    LinkStNode* p;
    if (s->next == NULL)    //判断为空的情况
    {
        cout << "栈为空,无需出栈" << endl;
        return false;
    }
    p = s->next;            //p指向首节点
    s->next = p->next;      //删除首节点
    s->length--;
    free(p);                //释放被删除节点的存储空间
    return true;
}

//取栈顶元素
bool GetTop(LinkStNode* s)
{
    ElemType e;
    if (s->next == NULL) //栈空情况
    {
        cout << "该栈为空,无顶元素" << endl;
        return false;
    }
    e = s->next->data;   //提取首节点
    cout << "首节点的值为" << e << endl;
    return true;
}

// 遍历栈
void Travers(LinkStNode *&s) {
    LinkStNode* m = s;
    int p = s->length;
    for(int i =0;i<p;i++)
    {
        cout << m->next->data << endl;
        m = m->next;
    }
}

//添加栈元素
void CreateNode(LinkStNode *&s)
{
    cout << "添加数据,输入-1为结束" << endl;
    ElemType e=0;
    while (true)
    {
        cin >> e;
        if (e == -1)
            break;
        LinkStNode* p;
        p = (LinkStNode*)malloc(sizeof(LinkStNode));  //新建结点p
        p->data = e;                                  //存放元素e
        p->next = s->next;                            //将p节点插入作为首节点
        s->next = p;
        s->length++;
    }
}

void Menu()
{
    cout << "************************************************************************" << endl;
    cout << "*********************  1、添加栈元素             ***********************" << endl;
    cout << "*********************  2、销毁栈                 ***********************" << endl;
    cout << "*********************  3、判断是否为空栈         ***********************" << endl;
    cout << "*********************  4、进栈一个元素           ***********************" << endl;
    cout << "*********************  5、出栈一个元素           ***********************" << endl;
    cout << "*********************  6、取栈顶元素             ***********************" << endl;
    cout << "*********************  7、遍历栈元素             ***********************" << endl;
    cout << "*********************  0、退出管理系统           ***********************" << endl;
    cout << "************************************************************************" << endl;
}

int main()
{
    LinkStNode * s;
    Init(s);    //初始化
    while (true)
    {
        Menu();
        cout << "请输入你的操作:\n";
        int select = 0;
        cin >> select;
        switch (select)
        {
        case 1:
            CreateNode(s);       //添加
            break;
        case 2:
            DestroyStack(s);    //销毁
            break;
        case 3:
            StackEmpty(s);      //判断
            break;
        case 4:
            Push(s);     //进栈
            break;
        case 5:
            Pop(s);     //出栈         
            break;
        case 6:
            GetTop(s);     //取顶
            break;
        case 7:
            Travers(s);     //遍历
            break;
        case 0:
            return 0;
            break;
        default:
            cout << "无效输入,请重新输入:\n";
            break;
        }
    }
    system("pause");
    return 0;
}

总结

希望大家会从这里有所收获。

你可能感兴趣的:(数据结构,c++,链表)