C语言 实现 顺序栈

来源:互联网 发布:matlab画矩阵灰度图 编辑:程序博客网 时间:2024/05/16 18:21

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,失败返回0int push(PSeqStack stack,DataType x);//出栈,成功返回1,失败返回0int 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,失败返回0int 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,失败返回0int 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;}

好!大功告成!!!