loong qiang
像风一样自由

栈的链表实现

LinkStack.h

#ifndef LINKSTACK_H_
#define LINKSTACK_H_

typedef int DataType;               //自定义数据类型,假定为整型

struct Node;                        //单链表结点类型
typedef struct Node *PNode;         //结点指针类型

typedef struct Node                 //单链表结点结构
{
    DataType info;                  //结点数据域
    PNode link;                     //结点指针域
}Node;

typedef struct LinkStack           //链表栈定义
{
    PNode top;        //栈顶指针
}LinkStack;

typedef struct LinkStack * PLinkStack;    //链表栈的指针类型

//创建一个空栈
PLinkStack createEmptyStack( void );

//判断栈是否为空栈
int isEmptyStack(PLinkStack stack);

//进栈,成功返回1,失败返回0
int push(PLinkStack stack,DataType x);

//出栈,成功返回1,失败返回0
int pop(PLinkStack stack);

//取栈顶元素
DataType getTop(PLinkStack stack);

//显示栈内所有元素
void showStack(PLinkStack stack);

//把栈置空
void setEmpty(PLinkStack stack);

//把栈销毁
void destroyStack(PLinkStack stack);


#endif /* LINKSTACK_H_ */

LinkStack.c

#include <stdio.h>
#include <malloc.h>
#include "LinkStack.h"

//创建一个的空栈
PLinkStack createEmptyStack(void)
{
    PLinkStack stack=(PLinkStack)malloc(sizeof(struct LinkStack));
    if(stack == NULL)
        printf("存储分配失败,请重建栈!\n");
    else
        stack->top=NULL;
    return stack;
}

//判断栈是否为空栈
int isEmptyStack(PLinkStack stack)
{
    return (stack->top == NULL);
}


//进栈,成功返回1,失败返回0
int push(PLinkStack stack,DataType x)
{
    PNode p =(PNode)malloc(sizeof(struct Node));
    if(p == NULL )
    {
        printf("新结点分配内存失败,进栈失败,请重试!\n");
        return 0;
    }
    else
    {
        p->info = x;
        p->link=stack->top;     //替换栈顶元素
        stack->top=p;
        return 1;
    }
}

//出栈,成功返回1,失败返回0
int pop(PLinkStack stack)
{
    if(isEmptyStack(stack))
    {
        printf("栈为空!\n");
        return 0;
    }
    else
    {
        PNode p;
        p=stack->top;   //删除最后一个结点
        stack->top = stack->top->link;
        free(p);
        return 1;
    }
}

//取栈顶元素
DataType getTop(PLinkStack stack)
{
    if(isEmptyStack(stack))
    {
        printf("栈为空!取栈顶元素失败!\n");
        return NULL;
    }
    return (stack->top->info);
}


//显示栈内所有元素
void showStack(PLinkStack stack)
{
    if(isEmptyStack(stack))
        printf("当前栈为空!无内容可显示。\n");
    else
    {
        PNode p;
        p=stack->top;
        printf("顶--> ");
        while(p->link != NULL)
        {
            printf("%d ",p->info);
            p=p->link;
        }
        printf("%d ",p->info);  //显示最后一个元素
        printf("-->底\n");
    }
}

//把栈置空
void setEmpty(PLinkStack stack)
{
    stack->top=NULL;
}

//把栈销毁
void destroyStack(PLinkStack stack)
{
    if(stack)
    {
        stack->top=NULL;
        free(stack);
    }
}

 

LinkStackMain.c

#include <stdio.h>
#include "LinkStack.h"

int main() {
    PLinkStack stack;
    int i;
    stack = createEmptyStack();
    printf("0-9依次入栈并输出如下:\n");
    for (i = 0; i < 10; i++) {
        push(stack, i);
    }
    showStack(stack);
    printf("栈中元素依次出栈并输出如下:\n");
    for (i = 0; i < 10; i++) {
        pop(stack);
    }

    destroyStack(stack);
    printf("栈已被销毁\n");

    return 0;
}

 栈的数组实现 

#include <stdio.h>
#include <malloc.h>

#define STACK_SIZE 50

typedef struct SeqStack
{
    int data[STACK_SIZE];
    int top;
}stack;

void InitStack(stack * s)
{
    s->top = -1;
}

int IsFull(stack *s)
{
    return (s->top == STACK_SIZE - 1);
}

int IsEmpty(stack *s){
    return (s->top == -1);
}

void Push(stack *s,int n)
{
    if(IsFull(s))
    {
        printf("Stack is full!\n");
        return;
    }
    s->top++;
    s->data[s->top] = n;
}

int Pop(stack *s)
{
    if(IsEmpty(s))
    {
        printf("Stack is empty!\n");
        return -1;
    }
    return s->data[s->top--];
}

int  main()
{
    stack *s = (stack *)malloc(sizeof(stack));
    if(s == NULL)
    {
        printf("Malloc failed!");
        exit(0);
    }

    InitStack(s);

    int i;
    for(i=0;i<10;i++)
    {
        Push(s,i);
    }

    while(!IsEmpty(s))
    {
        int data = Pop(s);
        printf("%d->",data);
    }

    return 0;
}

 栈的数组实现 固定了数组大小,链表实现动态生成空间,都可以实现栈的数据结构特点。

 最基础的数据结构:数组和链表,其他复杂数据结构都可以在这两种基础数据结构基础上构建。

 

posted on 2014-07-06 16:43  loong qiang  阅读(425)  评论(0编辑  收藏  举报