栈是一种先进后出的数据结构,就像将子弹压入枪膛,子弹不是先进先出而是先进后出

它的操作是有限制的,其限制是仅允许在表的一端进行插入和删除运算。栈的一端称为顶部,另一端则称为底部。

栈的严格定义

栈(Stack)又称堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。人们把此端称为栈顶,栈顶的第一个元素被称为栈顶元素,相对地,把另一端称为栈底。向一个栈插入新元素又称为进栈或入栈,它是把该元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称为出栈或退栈,它是把栈顶元素删除掉,使其下面的相邻元素成为新的栈顶元素。

栈的存储结构

栈由于也是一种线性存储结构,所以栈可以用数组或者链表的形式来实现。也就是顺序存储结构和链式存储结构。

顺序存储结构

首先来给出顺序存储结构的栈的抽象数据类型

ADT STACK is
            Data:
                采用顺序或链接方式存储的栈,假定其存储类型用StackType
                标识符表示。
            Operation:
                void InitStack(StackType& S);
                        // 初始化栈S,即把它置为空
                void ClearStack(StackType& S);
                        // 清除栈S中的所有元素,使之成为一个空栈
                int StackEmpty(StackType& S);
                        // 判断S是否为空,若是则返回1,否则返回0
                ElemType Peek(StackType& S)
                        // 返回S的栈顶元素,但不移动栈顶指针
                void Push(StackType& S, const ElemType& item)
                        // 元素item进栈,即插入到栈顶
                ElemType Pop(StackType& S)
                        // 删除栈顶元素并返回之
               int StackFull(Stack& S)
                       // 若栈已满则返回1,否则返回0,此函数为顺
                       // 序存储的栈所特有
        end STACK

栈的数据可以保存在一个结构体变量中所以我们可以给出这样的一个结构体

 struct Stack {
            ElemType stack[MaxSize];
            int top;//栈顶指针
  };

MaxSize 是 允许存储的最大个数,可以用#define形式定义一个。

在顺序存储结构的栈中top为-1时栈为空所以每次向栈中压入一个元素使每次使top加一,每次取出一个元素时使top减一。

在验证栈是否为空时则使用top==-1这个条件。

每次向栈中压入数据时,则需要每次验证top==MaxSize-1这个条件,若栈满则不能向栈中压入新的元素。

下面是写的例程有些功能比较简单没有实现,仅供参考

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status;//状态指标
typedef int ElemType;
typedef struct{
    ElemType data[MAXSIZE];
    int top;
} SqStack;
int main()
{
    printf("Hello world!\n");
    return 0;
}
Status Push(SqStack * S,ElemType){
    if(StackFull(S)){
        return ERROR;
    }
    S->top++;
    S->data[S->data] = e;
    return OK;
}
Status Pop(SqStack * S,ElemType * e){
    if(StackEmpty(S)){
        return ERROR;
    }
    *e = S->data[S->top];
    S->top--;
    return OK;
}
Status StackEmpty(SqStack * S){
    if(S->top==-1){
        return TRUE;
    }
    return FALSE;
}

Status StackFull(SqStack * S){
    if(S->top == MAXSIZE-1){
        return TURE;
    }
    return FALSE;
}

链式存储结构

抽象数据类型

ADT STACK is
            Data:
                采用顺序或链接方式存储的栈,假定其存储类型用StackType
                标识符表示。
            Operation:
                void InitStack(StackType& S);
                        // 初始化栈S,即把它置为空
                void ClearStack(StackType& S);
                        // 清除栈S中的所有元素,使之成为一个空栈
                int StackEmpty(StackType& S);
                        // 判断S是否为空,若是则返回1,否则返回0
                ElemType Peek(StackType& S)
                        // 返回S的栈顶元素,但不移动栈顶指针
                void Push(StackType& S, const ElemType& item)
                        // 元素item进栈,即插入到栈顶
                ElemType Pop(StackType& S)
                        // 删除栈顶元素并返回之
               int StackFull(Stack& S)
                       // 若栈已满则返回1,否则返回0,此函数为顺
                       // 序存储的栈所特有
        end STACK

首先给出两个结构体的预编译

typedef struct StackNode{
    ElemType data;
    struct StackNode * next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack{
    LinkStackPtr top;
    int count;
} LinkStack;

StackNode 为 每个结点的数据类型 每个StackNode中的next就是指向下一个节点的指针,LinkStack即为存储头结点和计数的结构体

下面给链表实现的栈给出部分代码:

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status;
typedef int ElemType;
typedef struct StackNode{
    ElemType data;
    struct StackNode * next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack{
    LinkStackPtr top;
    int count;
} LinkStack;
int main()
{
    printf("Hello world!\n");
    return 0;
}


Status Push(LinkStack * S,ElemType e){
    LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));//申请新的空间
    s->data=e;//新结点的值
    s->next=S->top;//将新的结点的next指针指向原来的S->top
    S->top=s;//新的S->top
    S->count++;//计数加
    return OK;
}

Status StackEmpty(LinkStack * S){
    if(S->top){
        return TRUE;
    }
}//验证是否为空表

Status Pop(LinkStack * S,ElemType * e){
    LinkStackPtr p;
    if(StackEmpty(*S)){
        return ERROR;+
    }
    *e = S->top->data;
    p=S->top;
    S->top=S->top->next;
    free(p);
    S->count--;
    return OK;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值