数据结构-栈

1、顺序栈的结构C语言描述

#define TRUE 1
#define FALSE 0
#define Stack_Size 50
typedef struct{
    StackElementType elem[Stack_Size];
    int top;
}SeqStack

顺序栈的基本操作

(1)初始化操作

void lnitStack(SeqStack *s)
{
    s->top=-1;
}

(2)判栈空操作

int isEmpty(SeqStack *S)
{
    return(s->top==-1?TRUE:FALSE);
}

(3)判栈满操作

int isFull(SeqStack *S)
{
    return(s->top==Stack_Size-1?TRUE:FALSE);
}

(4)进栈操作

int push(SeqStack *s,StackElementType x)
{
    if(s->top==Stack_Size-1)
        return(FALSE);  //判栈满
    s->top++;
    s->elem[s->top]=x;
    return(TRUE);
}

(5)出栈操作

int pop(SeqStack *S,StackElementType *x)
{
    if(s->top==-1)
        return(FALSE);  //判栈空
    else
    {
        *x=s->elem[s->topn];    //栈顶要出栈的元素给x
        s->top--;
        return(TRUE);
    }
}

(6)读栈顶元素操作

读栈顶元素操作与出栈操作大致相同,它们的区别仅在于读栈顶元素操作时候栈顶指针不动,栈内保持不变。

int getTop(SeqStack s,StackElementType *x)
{
    if(s->top==-1)
        return(FALSE);
    else
    {
        *x=s->elem[s->top];
        return[TRUE];
    }
}

2、两栈共享技术

利用了栈的栈底位置不变,而栈顶位置动态变化的特性,为两个栈申请一个共享的一维数组空间s[M],将两个栈的栈底分别为一维数组的两端0和M-1。

两栈共享的基本操作

(1)结构定义

#define M100
typedef struct
{
    StackElementType Stack[M];
    int top[2];
}DqStack;

(2)两栈共享的初始化操作

void initStack(DqStack *S)
{
    s->top[0]=-1;
    s->top[1]=M;
}

(3)两栈共享的进栈操作

int push(DqStack *s,StackElementType x,int i)
{
    if(s->top[0]+1==s->top[1])
        return(FALSE);
    switch(i)
    {
        case 0:s->top[0]++;
               s->Stack[s->top[0]]=x;
               break;
        case 1:s->top[1]--;
               s->Stack[s->top[1]]=x;
               break;
        default:return(FALSE);
    }
    return(TRUE);
}

(4)两栈共享的出栈操作

int pop(DqStack *s,StackElementType *x,int i)
{
    switch(i)
    {
        case 0:if(s->top==-1)   return(FALSE);
               *x=s->Stack[s->top[0]];
               s->top[0]--;
               break;
        case 1:if(s->top[1]==M) return(FALSE);
               *x=s->Stack[s->top[1]];
               s->top[1]++;
               break;
        default:return(FALSE);
    }
    return(TRUE);
}

3、栈的链式存储结构

(1)用C语言定义的链式存储结构

typedef struct Node
{
    StackElementType data;
    struct node *next;
}LinkStackNode;
typedef LinkStackNode *LinkStack;

(2)链栈的进栈操作

int push(LinkStack top,StackElementType x)
{
    LinkStackNode *temp;
    temp=(LinkStackNode *)malloc(sizeof(LinkStackNode));
    if(temp==Null)  return(FALSE);
    temp->data=x;
    temp->next=top->next;
    top-next=temp;
    return(TRUE);
}

(3)链栈的出栈操作

int pop(LinkStack top,StackElementType *x)
{
    LinkStackNode *temp;
    temp=top->next;
    if(temp==Null)  return(FALSE);
    top->next=temp->next;
    *x=temp->data;
    free(temp);
    return(TRUE);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值