数据结构栈的基本操作(创建、入栈、出栈、销毁)

源代码如下:
/采用Dev编译器,编译通过,成功运行/

#include 
#include 
#include "head.h"

int main()
{
    Sqstack S;
    Selemtype e;
    char choice;
    int n; //用来存储输入的栈的长度 
    while(1)
    {
        menu();//菜单函数 
        printf("输入你的选择:\n");
        scanf("%c",&choice);
        getchar();//每输入一个数据,都要取走回车符,防止switch语句误判 
        switch(choice)
        {
            case '1':
                CreateSqstack(S);
                printf("空栈创建成功!\n");
                printf("开始创建栈,输入你想创建栈的长度:");
                scanf("%d",&n);
                getchar();//取走回车符 
                for(int i=0;iscanf("%d",&e);
                    getchar();//取走回车符 
                    Push(S,e);
                }
                printf("创建的栈为:");
                StackTraverse(S);
                break;
            case '2':
                ClearStack(S);
                printf("栈已置为空!\n");
                break;
            case '3':
                printf("栈长为:%d\n",StackLength(S));
                break;
            case '4':
                if(!GetTop(S,e)) printf("已是空栈!\n");
                else
                {
                    printf("栈顶元素为:%d\n",e);
                }
                break;
            case '5':
                printf("输入你想压入栈的元素e:");
                scanf("%d",&e);
                getchar();
                Push(S,e);
                printf("元素已压入栈!\n");
                printf("压入后的栈为:");
                StackTraverse(S);
                break;
            case '6':
                if(!Pop(S,e)) printf("已是空栈!\n");
                else
                {
                    printf("取出的元素为:%d\n",e);
                    printf("取出后的栈为:");
                    StackTraverse(S);
                }
                break;
            case '7':
                if(!StackEmpty(S)) printf("不为空栈!\n");
                else printf("空栈!\n");
                break; 
            case '8':
                StackTraverse(S);
                break;
            case '9':
                DestroyStack(S);
                printf("栈已销毁!\n");
                StackTraverse(S);
                break; 
            default :
                exit(0);
                break;
        }
    }
    return 0;
}


#define STACK_INIT_SIZE 100//初始分配量 
#define STACKINCREMENT 10//增量 
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE -1


typedef int Status;
typedef int Selemtype;
typedef struct{
    Selemtype *base;
    Selemtype *top;
    int stacksize;
}Sqstack;

Status CreateSqstack(Sqstack &S)//创建函数 
{
    S.base = (Selemtype *)malloc(STACK_INIT_SIZE*sizeof(Selemtype));
    if(!S.base) 
    {
        printf("创建栈失败!\n");
        exit(ERROR);
    }
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}
Status DestroyStack(Sqstack &S)//销毁栈操作 
{
    free(S.base);
    S.base = NULL;
    S.top = NULL;
    S.stacksize = 0;
    return OK;
} 
Status ClearStack(Sqstack &S)//置空栈函数 
{
    S.top = S.base;
    return OK;
}
Status StackEmpty(Sqstack S)//检查空栈函数 
{
    if(S.base == S.top) 
    {
        return OK;//为空栈 
    }
    else 
    {
        return ERROR;
    }
}
int StackLength(Sqstack S)//求栈长函数 
{
    return S.top - S.base;//指针直接相减 
} 
Status GetTop(Sqstack S,Selemtype &e)//不为空栈返回栈顶元素 
{
    if(!StackEmpty(S))
    {
        e = *(S.top-1);//对栈顶指针所指位置下一个进行解引用 
        return OK;
    }
    else return ERROR;
} 
Status Push(Sqstack &S,Selemtype e)//压栈操作 
{
    if(S.top - S.base >= S.stacksize)
    {
        S.base = (Selemtype *)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(Selemtype));
        if(!S.base) exit(ERROR);
        S.top = S.base + S.stacksize;//使top指针指向原来的位置
        S.stacksize += STACKINCREMENT;
    }
    *S.top++ = e;
    return OK;
}
Status Pop(Sqstack &S,Selemtype &e)//出栈操作 
{
    if(S.base == S.top) return ERROR;
    e = *--S.top;
    return OK;
}
Status StackTraverse(Sqstack S)//遍历栈操作 
{
    if(StackEmpty(S)) 
    {
        printf("栈已空,无法遍历!\n");
        return ERROR;
    } 
    while(S.base!=S.top)
        printf("%d ",*S.base++);
    printf("\n");
    return OK;
}

void menu()
{
    printf("————栈操作————\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("9.-----销毁栈\n");
}

你可能感兴趣的:(数据结构)