【数据结构】算法3.1-3.2 栈的顺序存储表示

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
//typedef int SElemType;
typedef char SElemType;
#define STACK_INIT_SIZE 100  //存储空间初始分配量
#define STACKINCREMENT 10  //存储空间分配增量

typedef struct
{
    SElemType *base;  //在栈构造之前和销毁之后,base的值为NULL
    SElemType *top;  //栈顶指针
    int stacksize;  //当前已分配的存储空间,以元素为单位
}SqStack;

/*******************************声明部分****************************************/
Status InitStack(SqStack *S);
//构造一个空栈S
Status GetTop(SqStack S,SElemType *e);
//若栈不空,则用e返回S的栈顶元素
Status Push(SqStack *S,SElemType e);
//插入元素e为新的栈顶元素
Status Pop(SqStack *S,SElemType *e);
//若栈不空,则删除S的栈顶元素,用e返回其值
int StackLength(SqStack S);
//返回S的元素个数,即栈长
Status StackEmpty(SqStack S);
//若栈S为空,则返回TRUE,否则FALSE
void conversion();
//对于输入任意一个非负十进制整数,打印输出其八进制数
void ClearStack(SqStack *S);
//把S置为空栈
/*******************************函数部分****************************************/

Status InitStack(SqStack *S)
{
    (*S).base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!(*S).base)
        exit(OVERFLOW);
    (*S).top = (*S).base;
    (*S).stacksize = STACK_INIT_SIZE;
    return OK;
}

Status GetTop(SqStack S,SElemType *e)
{
    if(S.top == S.base)
        return ERROR;
    *e = *(S.top-1);
    return OK;
}

Status Push(SqStack *S,SElemType e)
{
    if((*S).top - (*S).base >= (*S).stacksize){  //栈满,追加空间
        (*S).base = (SElemType *)realloc((*S).base,((*S).stacksize + STACKINCREMENT)* sizeof(SElemType));
    if( !(*S).base)
        exit(OVERFLOW);
    (*S).top = (*S).base + (*S).stacksize;
    (*S).stacksize += STACKINCREMENT;
    }
    *(*S).top++ = e;
    return OK;
}

Status Pop(SqStack *S,SElemType *e)
{
    if((*S).top == (*S).base)
        return ERROR;
    *e = *--(*S).top;
    return OK;
}

int StackLength(SqStack S)
{
    return S.top-S.base;
}

void Visit(SElemType e)
{
    printf("%d->",e);
}

void StackTraverse(SqStack S)
{
    while(S.base != S.top){
        S.top--;
        Visit(*S.top);
    }
}

Status StackEmpty(SqStack S)
{
    return S.base == S.top ? TRUE : FALSE;
}

void conversion()
{
    SqStack L;
    SElemType e;
    int N;
    InitStack(&L);
    printf("\n\n请输入一位非负十进制整数,程序返回其八进制:\n");
    scanf("%d",&N);
    while(N){
        Push(&L,N%8);
        N = N/8;
    }
    while(!StackEmpty(L)){
        Pop(&L,&e);
        printf("%d",e);
    }
    printf("\n");
}

void ClearStack(SqStack *S)
{
    while((*S).base != (*S).top )
        (*S).top--;
    (*S).stacksize = 0;
}
void LineEdit()
{
    SqStack L;
    char c,ch,*p;
    InitStack(&L);  //构造空栈
    printf("输入:");
    ch = getchar();  //从终端接收第一个字符
    while(ch != EOF){
        printf("输出:");
        while(ch != EOF && ch != '\n'){
            switch(ch)
            {
                case '#':
                    Pop(&L,&c);
                    break;
                case '@':
                    ClearStack(&L);
                    break;
                default :
                    Push(&L,ch);
                    break;
            }//switch
            ch = getchar();  //从终端接收下一个字符
        }//while
    p = L.base;
    while(p != L.top){
        printf("%c",*p);
        ++p;
    }
    printf("\n");
    ClearStack(&L);
    if(ch != EOF)
        printf("输入:");
        ch = getchar();
    }
}
/*******************************主函数部分**************************************/
/*
int main()
{
    SqStack S;
    InitStack(&S);
    int ct;
    for(ct = 1;ct <= 5;ct++)
        Push(&S,ct);
    printf("当前栈的元素如下:\n");
    StackTraverse(S);

    SElemType e;
    GetTop(S,&e);
    printf("\n当前的栈顶元素为: %d\n",e);

    Pop(&S,&e);
    printf("\n删除栈顶元素后:\n");
    StackTraverse(S);

    conversion();
}*/
int main()
{
    //输入测试:
    //whli##ilr#e(s#*s)
    //outcha@putchar(*s=#++);
    LineEdit();
    return 0;
}

程序输入EOF时停止,可以键入ctrl+z
程序显示EOF为^z

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值