大话数据结构——栈

栈(Stack):限定仅在表尾进行插入和删除操作的线性表,LIFO结构。

栈的抽象数据类型:

ADT 栈(stack)
Data
Operation
    InitStack ( *S ):初始化操作.建立一个空栈S。
    DestroyStack ( *S ):若栈存在,則销毁它。
    ClearStack (*S):将栈清空。
    StackEmpty ( S ):若栈为空,返回true,否則返回 false。
    GetTop (S,*e):若栈存在且非空,用e返回S的栈顶元素。
    Push (*S,e):若栈S存在,插入新元素e到栈S中并成为栈頂元素。
    Pop (*S,*e):删除栈S中栈顶元素,并用e返回其值。
    StackLength (S):返回回栈S的元素个数。
endADT

栈的顺序存储结构:

一般把下标为0的一端作为栈底。

typedef int SElemType;

typedef struct
{	

    SElemType data[MAXSIZE];	    
	int top;                 //用于栈顶指针     

}SqStack;

进栈操作:

Status Push(SqStack *S, SElemType e)
{
    if(S->top == MAXSIZE - 1)
    	return ERROR;
    S->top++;
    S->data[S->top]=e;
    return OK;
}

出栈操作:

Status Pop(SqStack *S, SElemType e)
{
    if(S->top == - 1)
    	return ERROR;
    *e = S->data[S->top];         //将要删除的栈顶元素赋值
    S->top--;
    return OK;
}

两栈共享存储空间:

使用这样的数据结构,通常都是当两个栈的空间需求有相反关系时。

typedef struct

{

    SElemType data[MAXSIZE];

    int top1;

    int top2;

}SqDoubleStack;

栈的链式存储结构:

typedef struct StackNode
{
	SElemType data;
	struct StackNode *next;
}StackNode, *LinkStackPtr;

typedef struct LinkStack
{	

  	 LinkStackPtr top;
     int count;

}LinkStack;

进栈操作:

Status Push(LinkStack *S, SElemType e)
{
    LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
    s->data=e;
    s->next = S->top;
    S->top = s;
    S->count++;
    return OK;
}

出栈操作:

Status Pop(LinkStack *S, SElemType 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;
}

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