数据结构之对顺序栈的操作(C语言版)

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
static int flag=0;
typedef struct
{
    int *base;
    int *top;
    int stacksize;
}SqStack;
int InitStack(SqStack &S)
{
    S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));
    if(!S.base)
        printf("分配空间失败.\n");
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    printf("成功初始化栈.\n");
    flag=1;
    return 0;
}//构造一个空栈 S .
void DestroyStack(SqStack &S)
{
    if(S.base!=0 && flag==1)
    {
        while(S.top!=S.base)
            S.top--;
        free(S.top);
        S.base=NULL;
        printf("成功销毁栈\n");
        flag=0;
    }   
    else
        printf("无栈状态\n");
}//销毁栈S,S不再存在.
void ClearStack(SqStack &S)
{
    int *p;
    while(S.top!=S.base)
    {
        p=S.top;
        S.top--;
    }
    printf("成功将栈重置.\n");
}//把S置为空栈.
void StackEmpty(SqStack &S)
{
    if(S.top-S.base==S.stacksize)
        printf("栈满状态.\n");
    else if(S.top==S.base)
        printf("空栈状态.\n");
    else if(S.base==NULL)
        printf("无栈状态.\n");
    else
        printf("存在栈,既不是空栈,也不是栈满\n");
}//判断是否为空栈.
void StackLength(SqStack &S)
{
    int num=0;
    SqStack L;
    int *p;
    L=S;
    while(L.top!=L.base)
    {
        p=S.top;
        L.top--;
        num++;
    }
    printf("栈的长度是:%d\n",num);
}//返回栈的长度
/*void StackLength(SqStack &S)
{
    int num=0;
    num=S.top-S.base;
    printf("栈的长度是:%d\n",num);
}*/
int GetTop(SqStack &S)
{
    int  e;
    if(S.top==S.base)
    {
        printf("空栈状态,没有栈顶元素\n");
        return ERROR;
    }
    e=*(S.top-1);
    printf("栈顶元素是:%d\n",e);
    return OK;   
}//返回栈顶元素.
int Push(SqStack &S,int e)
{
    if(S.top-S.base>=S.stacksize)
    {
        S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
        if(!S.base)
            printf("存储分配空间.\n");
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;
    printf("成功插入该元素.\n");
    return OK;
}//插入元素为新的栈顶元素.
int Pop(SqStack &S)
{
    int e;
    if(S.top==S.base)
        printf("空栈状态,没有元素\n");
    e=* --S.top;
    printf("删除的栈顶元素是:%d\n",e);
    return OK;
}//删除栈顶元素.
/*int Pop(SqStack &S)
{
    int e;
    if(S.top==S.base){
        printf("空栈状态,没有元素\n");
        return ERROR;
    }
    e=* --S.top;
    printf("删除的栈顶元素是:%d\n",e);
    return OK;
}*/
int StackTraverse(SqStack &S)
{
    SqStack L;
    int e;
    L=S;
    if(S.top==S.base)
    {
        printf("空栈,没有元素\n");
        return ERROR;
    }
    printf("栈内元素是:\n");
    while(L.top!=L.base)
    {
        e=*L.base;
        L.base++;
        printf("%15d\n",e);
    }
    return OK;
}//遍历栈.
void CreatSq(SqStack &S,int i)
{
    int j;
    S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));
    if(!S.base)
        printf("分配空间失败.\n");
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    printf("请输入栈中元素:\n");
    for(j=1;j<=i;j++)
    {
        printf("第%d个元素是:",j);
        scanf("%d",S.top);
        S.top++;
    }
    flag=1;
}//创建栈.
void Tips()
{
    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");
    printf("************************  10.创建并输入栈元素             ********************\n");
    printf("************************  11.退出                         ********************\n");
    printf("******************************************************************************\n");
}
int main()
{
    int a,b,i;
    int just=0;
    SqStack S;
    do
    {
        system("cls");
        Tips();
        printf("请输入选择:");
        scanf("%d",&i);
        switch(i)
        {
            case 1:InitStack(S);just=1;break;
            case 2: DestroyStack(S);just=0;break;
            case 3:{
                    if(just==0)
                        printf("无栈状态.\n");
                    else
                    {
                        ClearStack(S);
                        just=1;
                    }
                    break;
                   }
            case 4:{
                    if(just==0)
                        printf("无栈状态.\n");
                    else
                        StackEmpty(S);
                    break;
                   }
            case 5:{
                    if(just==0)
                        printf("无栈状态.\n");
                    else
                    StackLength(S);
                    break;
                   }
            case 6:{
                    if(just==0)
                        printf("无栈状态.\n");
                    else
                    GetTop(S);
                    break;
                   }
            case 7:{
                    if(just==0)
                        printf("无栈状态.\n");
                    else
                    {
                        printf("请输入插入的栈顶元素:");
                        scanf("%d",&b);
                        Push(S,b);
                    }
                    break;
                   }
            case 8:{
                    if(just==0)
                        printf("无栈状态.\n");
                    else
                        Pop(S);
                    break;
                   }
            case 9:{
                    if(just==0)
                        printf("无栈状态.\n");
                    else
                        StackTraverse(S);
                    break;
                   }
            case 10:{
                    printf("请输入栈的长度:"); 
                    scanf("%d",&a);
                    CreatSq(S,a);
                    just=1;
                    break;
                    }
            case 11:printf("操作结束.\n");exit(0);
            default:printf("没有该选项,请重新操作.\n");break;
        }
        system("pause");
    }while(1);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值