C语言 实现 链表栈

LinkStack.h 头文件声明如下:

#include <stdio.h>

typedef int DataType;               //自定义数据类型,假定为整型

struct Node;                        //单链表结点类型
typedef struct Node *PNode;         //结点指针类型

typedef struct Node                 //单链表结点结构
{   
    DataType info;                  //结点数据域
    PNode link;                     //结点指针域
}Node;

typedef struct LinkStack           //链表栈定义
{
    PNode top;        //栈顶指针
}LinkStack;

typedef struct LinkStack * PLinkStack;    //链表栈的指针类型

//创建一个空栈
PLinkStack createEmptyStack( void );

//判断栈是否为空栈
int isEmptyStack(PLinkStack stack);

//进栈,成功返回1,失败返回0
int push(PLinkStack stack,DataType x);

//出栈,成功返回1,失败返回0
int pop(PLinkStack stack);

//取栈顶元素
DataType getTop(PLinkStack stack);

//显示栈内所有元素 
void showStack(PLinkStack stack);

//把栈置空
void setEmpty(PLinkStack stack);

//把栈销毁
void destroyStack(PLinkStack stack);


LinkStack.cpp 使用链表实现栈的基本操作,代码如下:

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

//创建一个的空栈
PLinkStack createEmptyStack(void)
{
    PLinkStack stack=(PLinkStack)malloc(sizeof(struct LinkStack));
    if(stack == NULL)
        printf("存储分配失败,请重建栈!\n");
    else
        stack->top=NULL;
    return stack;   
}

//判断栈是否为空栈
int isEmptyStack(PLinkStack stack)
{
    return (stack->top == NULL);
}


//进栈,成功返回1,失败返回0
int push(PLinkStack stack,DataType x)
{
    PNode p =(PNode)malloc(sizeof(struct Node));
    if(p == NULL )  
    {
        printf("新结点分配内存失败,进栈失败,请重试!\n");
        return 0;
    }
    else
    {
        p->info = x;
        p->link=stack->top;     //替换栈顶元素
        stack->top=p;
        return 1;
    }
}

//出栈,成功返回1,失败返回0
int pop(PLinkStack stack)
{
    if(isEmptyStack(stack))
    {
        printf("栈为空!\n");
        return 0;
    }
    else
    {
        PNode p;
        p=stack->top;   //删除最后一个结点
        stack->top = stack->top->link;
        free(p);
        return 1;
    }
}

//取栈顶元素
DataType getTop(PLinkStack stack)
{
    if(isEmptyStack(stack))
    {
        printf("栈为空!取栈顶元素失败!\n");
        return NULL;
    }
    return (stack->top->info);
}


//显示栈内所有元素 
void showStack(PLinkStack stack)
{
    if(isEmptyStack(stack))
        printf("当前栈为空!无内容可显示。\n");
    else
    {
        PNode p;
        p=stack->top;
        printf("顶--> ");
        while(p->link != NULL)
        {
            printf("%d ",p->info);
            p=p->link;
        }
        printf("%d ",p->info);  //显示最后一个元素
        printf("-->底\n");
    }
}

//把栈置空
void setEmpty(PLinkStack stack)
{
    stack->top=NULL;
}

//把栈销毁
void destroyStack(PLinkStack stack)
{
    if(stack)
    {
        stack->top=NULL;
        free(stack);
    }
}

main.cpp 文件实现main函数对链栈进行调用操作:

#define _CRT_SECURE_NO_DEPRECATE    //解决在VS环境里出现的警告问题
#include <stdio.h>
#include "LinkStack.h"

int main( )
{
    char input;
    DataType data;
    PLinkStack stack;
    do
    {
        printf("---------------------------------------------\n");
        printf("---------------------------------------------\n");
        printf("----       输入对应字符执行以下操作      ----\n");
        printf("----                                     ----\n");
        printf("----         \"0\":创建一个空栈           ----\n");
        printf("----         \"1\":检查栈是否为空         ----\n");
        printf("----         \"3\":执行入栈操作           ----\n");
        printf("----         \"4\":执行出栈操作           ----\n");
        printf("----         \"5\":打印栈顶元素           ----\n");
        printf("----         \"6\":打印栈内所有元素       ----\n");
        printf("----         \"7\":把栈清空               ----\n");
        printf("----         \"8\":把栈销毁               ----\n");
        printf("----         \"q\":退出程序               ----\n");
        printf("---------------------------------------------\n");
        printf("---------------------------------------------\n");
        printf("选择操作:");
        scanf("%c",&input);
        
        switch(input)
        {
            case '0':
                stack=createEmptyStack();
                printf("成功创建链表栈。\n");
                break;
                
             case '1':
                if(isEmptyStack(stack))
                    printf("该栈当前为空栈!\n");
                else
                    printf("该栈当前不为空栈!\n");
                break;
                     
            case '3':
                fflush(stdin);
                printf("请输入要入栈的值:");
                scanf("%d",&data);
                if( push(stack,data))
                {
                    printf("入栈成功,栈当前内容:");
                    showStack(stack);
                }
                else
                {
                    printf("入栈失败,请检查!\n");
                }
                break;
                
            case '4':
                if( pop(stack))
                {
                    printf("出栈成功,栈当前内容:");
                    showStack(stack);
                }
                else
                {
                    printf("出栈失败,请检查!\n");
                }
                break;
                
             case '5':
                data=getTop(stack);
                printf("栈顶值为:%d\n",data);
                break;
                
             case '6':
                printf("栈当前内容:");
                showStack(stack);
                break;               
                
             case '7':
                setEmpty(stack);
                printf("栈当前内容:");
                showStack(stack);
                break;
                
             case '8':
                destroyStack(stack);
                printf("成功将栈销毁!\n");
                break;
             
            default:
                break;
        }
        printf("\n");
        fflush(stdin);   /*清空缓冲区,也可以使用rewind(stdin);*/
    }while( input != 'q' );
    
    return 0;
}


  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值