C语言 实现 顺序栈

SeqStack.h 头文件声明如下:

#include <stdio.h>

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

typedef struct SeqStack           //顺序栈定义
{
    int MAXNUM;     //栈存储容量标识
    int top;        //栈顶位置
    DataType *data; //栈存储的元素的指针,可看作一个数组名
}SeqStack;

typedef struct SeqStack * PSeqStack;    //顺序栈的指针类型

//创建一个容量为m的空栈
PSeqStack createEmptyStack(int m);

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

//判断栈是否已满
int isFullStack(PSeqStack stack);

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

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

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

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

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

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


SeqStack.cpp 定义代码如下:

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

//创建一个容量为m的空栈
PSeqStack createEmptyStack(int m)
{
    PSeqStack stack=(PSeqStack)malloc(sizeof(struct SeqStack));
    if(stack == NULL)
    {
        printf("存储分配失败,请重建栈!\n");
        return NULL;
    }
     //初始并分配栈元素存储空间,数组第一个元素不使用
    stack->data = (DataType *)malloc( (m+1) * sizeof(DataType));
    if(stack->data == NULL)
    {
        printf("存储分配失败,请重建栈!\n");
        return NULL;
    }
    
    stack->MAXNUM = m;     //栈容量
    stack->top = 0;        //栈内还未存储有元素
    return stack;    
}

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

//判断栈是否已满
int isFullStack(PSeqStack stack)
{
    return (stack->top == stack->MAXNUM);
}

//进栈,成功返回1,失败返回0
int push(PSeqStack stack,DataType x)
{
    if(isFullStack(stack))
    {
        printf("栈溢出!\n");
        return 0;
    }
    
    stack->top =stack->top + 1;
    stack->data[stack->top]=x;  //存储栈元素数组从下标1开始
    return 1;
}

//出栈,成功返回1,失败返回0
int pop(PSeqStack stack)
{
    if(isEmptyStack(stack))
    {
        printf("栈为空!\n");
        return 0;
    }
    stack->top=stack->top-1;
    return 1;
}

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


//显示栈内所有元素 
void showStack(PSeqStack stack)
{
    if(isEmptyStack(stack))
        printf("当前栈为空!无内容。\n");
    else
    {
        int i;
        printf("顶--> ");
        for(i=stack->top; i>0; i--)
        {
            printf("%d ",stack->data[i]);
        }
        printf("-->底\n");
    }
}

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

//把栈销毁
void destroyStack(PSeqStack stack)
{
    if(stack)
    {
        free(stack->data);
        stack->top=0;
        free(stack);
    }
}

main.cpp main函数调用顺序栈操作:

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

int main( )
{
    char input;
    int m;
    DataType data;
    PSeqStack stack;
    do
    {
        printf("---------------------------------------------\n");
        printf("---------------------------------------------\n");
        printf("----       输入对应字符执行以下操作      ----\n");
        printf("----                                     ----\n");
        printf("----         \"0\":创建一个空栈           ----\n");
        printf("----         \"1\":检查栈是否为空         ----\n");
        printf("----         \"2\":检查栈是否已满         ----\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':
                printf("请输入要创建的栈的容量大小:");
                scanf("%d",&m);
                stack=createEmptyStack(m);
                printf("成功创建一个容量为%d的栈。\n",m);
                break;
                
             case '1':
                if(isEmptyStack(stack))
                    printf("该栈当前为空栈!\n");
                else
                    printf("该栈当前不为空栈!\n");
                break;
               
            case '2':
                if(isFullStack(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;
}

好!大功告成!!!
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值