栈的C语言实现(链表和数组)

数组栈的实现

stack_array.h

#ifndef _stack_array_h

#define EmptyTOS (-1)
#define MinStackSize (5)
#define TRUE 1
#define FALSE 0

typedef int ElementType;

typedef struct StackArrayNode
{
    int Capacity;
    int TopOfStack;
    ElementType *Array;
}StackArrayNode,*Stack;

int IsEmpty(Stack S);
int IsFull(Stack S);
Stack CreatStack(int MaxStackSize);
void FreeStack(Stack S);
void Push(ElementType x, Stack S);
void Pop(Stack S);
ElementType Top(Stack S);
ElementType TopandPop(Stack S);

#endif

stack_array.c

#include <stdio.h>
#include <stdlib.h>
#include "stack_array.h"

int IsEmpty(Stack S)
{
    if(S->TopOfStack == EmptyTOS)
        return TRUE;
    else
        return FALSE;
}

int IsFull(Stack S)
{
    if(S->TopOfStack == S->Capacity)
        return TRUE;
    else
        return FALSE;
}

Stack CreatStack(int MaxStackSize)
{
    Stack S;

    if(MaxStackSize < MinStackSize)
        printf("Stack is too small\n");

    S = (Stack)malloc(sizeof(struct StackArrayNode));
    if(S == NULL)
        exit(FALSE);

    S->Array = (ElementType *)malloc(sizeof(ElementType)*MaxStackSize);
    if(S->Array == NULL)
        exit(FALSE);

    S->Capacity = MaxStackSize;
    S->TopOfStack = EmptyTOS;
}

void FreeStack(Stack S)
{
    if(S != NULL)
    {
        free(S->Array);
        free(S);
    }
}

void Push(ElementType x, Stack S)
{
    if(IsFull(S))
        printf("Stack is full\n");
    else
    {
        S->TopOfStack ++;
        S->Array[S->TopOfStack] = x;
    }
}

void Pop(Stack S)
{
    if(IsEmpty(S))
        printf("Stack is empty\n");
    else
    {
        S->TopOfStack --;
    }
}

ElementType Top(Stack S)
{
    if(!IsEmpty(S))
        return S->Array[S->TopOfStack];

    printf("Stack is Empty\n");
    return FALSE;

}

ElementType TopandPop(Stack S)
{
    if(!IsEmpty(S))
        return S->Array[S->TopOfStack--];
    printf("Stack is Empty\n");
    return FALSE;
}

int main()
{
    Stack S;
    S = CreatStack(10);
    Push(1,S);
    Push(2,S);
    Push(4,S);
    printf("%d\n",Top(S));
    Pop(S);
    printf("%d\n",Top(S));
    Pop(S);
    printf("%d\n",Top(S));
}

链表栈的实现

stack.h

#ifndef _Stack_h

#define TRUE 1
#define FALSE 0

typedef int ElementType;
typedef struct StackNode
{
    ElementType data;
    struct StackNode *next;
}StackNode,*Stack;

int isEmpty(Stack S);
Stack CreateStack(void);
void MakeEmpty(Stack S);
void Push(ElementType x, Stack S);
void Pop(Stack S);
ElementType Top(Stack S);

#endif   /*_Stack_h */

stack.c

#include <stdlib.h>
#include <stdio.h>
#include "stack.h"

int isEmpty(Stack S)
{
    if(S->next == NULL)
        return TRUE;
    else
        return FALSE;
}

void MakeEmpty(Stack S)
{
    if(S == NULL)
        printf("fata error");
    else
    {
        while(!isEmpty(S))
            Pop(S);
    }
}

Stack CreateStack(void)
{
    Stack S = (Stack)malloc(sizeof(struct StackNode));
    if(S == NULL)
        printf("fata error");
    S->next = NULL;
    MakeEmpty(S);
    return S;
}

void DeleteStack(Stack S)
{
    MakeEmpty(S);
    free(S);
}

void Push(ElementType x, Stack S)
{

    Stack TmpStack = (Stack)malloc(sizeof(struct StackNode));
    if(TmpStack == NULL)
        printf("fata error");
    else
    {
        TmpStack->data = x;
        TmpStack->next = S->next;
        S->next = TmpStack;
    }

}

void Pop(Stack S)
{
    Stack TmpStack;
    if(isEmpty(S))
        printf("Stack is Empty");
    else
    {
        TmpStack = S->next;
        S->next = S->next->next;
        free(TmpStack);
    }

}

ElementType Top(Stack S)
{
    if(isEmpty(S))
        return FALSE;
    else
        return S->next->data;
}

int main()
{
    Stack S = CreateStack();
    Push(1,S);
    Push(2,S);
    Push(4,S);
    printf("%d\n",Top(S));
    Pop(S);
    printf("%d\n",Top(S));
    Pop(S);
    printf("%d\n",Top(S));
}

参考自《数据结构与算法分析》

时间: 2024-11-05 11:38:24

栈的C语言实现(链表和数组)的相关文章

C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

目录 00 简介 01 算法概述 02 公用方法 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存的忙闲状态,为进程分配和释放内存.当主存的空间太小而无法装入所有的进程时,就需要在内存和硬盘之间进行调度操作. 多数操作系统只采用某种特定的页面置换算法进行置换,无法预先探测当前运行进程的页面访问模式,因此不能根据不同的页面访问模式,选用不同的页面置换算法.当然,如果能对不同的访问模式选取相应的页面置换算法,

“全栈2019”Java第二十八章:数组详解(上篇)

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第二十八章:数组详解(上篇) 下一章 "全栈2019"Java第二十九章:数组详解(中篇) 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组"

“全栈2019”Java第三十章:数组详解(下篇)

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第三十章:数组详解(下篇) 下一章 "全栈2019"Java第三十一章:二维数组和多维数组详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组&qu

C语言中指针和数组

C语言数组与指针的那些事儿 在C语言中,要说到哪一部分最难搞,首当其冲就是指针,指针永远是个让人又爱又恨的东西,用好了可以事半功倍,用不好,就会有改不完的bug和通不完的宵.但是程序员一般都有一种迷之自信,总认为自己是天选之人,明知山有虎,偏向虎山行,直到最后用C的人都要被指针虐一遍. 指针 首先,明确一个概念,指针是什么,一旦提到这个老生常谈且富有争议性的话题,那真是1000个人有1000种看法. 在国内的很多教材中,给出的定义一般就是"指针就是地址",从初步理解指针的角度来说,这种

链表和数组的区别

数组是线性结构,可以直接索引,即要去第i个元素,a[i]即可.链表也是线性结构,要取第i个元素,只需用指针往后遍历i次就可.貌似链表比数组还要麻烦些,而且效率低些. 想到这些相同处中的一些细微的不同处,于是他们的真正不同处渐渐显现了:链表的效率为何比数组低些?先从两者的初始化开始.数组无需初始化,因为数组的元素在内存的栈区,系统自动申请空间.而链表的结点元素在内存的堆区,每个元素须手动申请空间,如malloc.也就是说数组是静态分配内存,而链表是动态分配内存.链表如此麻烦为何还要用链表呢?数组不

C语言实现链表节点的插入

对链表进行增删改查是最基本的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除链表中的某个节点.这里我们要来实现在某个位置插入节点.示例代码上传至https://github.com/chenyufeng1991/InsertList  . 核心代码如下: Node *InsertToPosition(Node *pNode,int pos,int x){ if (pos < 0 || pos > sizeList(pNode) ) { printf("%s函数执

C语言中函数返回数组

#include "stdio.h"/*int* set(int a,int *c){ int *b; b=malloc(sizeof(int)*3); c[0]=a; c[1]=1+a; c[2]=2+a; b[0]=13; b[1]=14; b[2]=15; return b;}*/char *set(void){ char *buf; buf=malloc(sizeof(char)*3);//创建内存区 buf[0]=0x30; buf[1]=0x31; buf[2]=0x32;

C语言动态分配二维数组内存

C语言内存管理主要包括malloc().remalloc().free()三个函数. malloc原型 extern void *malloc(unsigned int num_bytes); m行n列的 二维数组的分配,主要有三种方法: 一.分配一个长度为m的二级指针,指针的指向的内容分别指向一个长度为n的一位数组 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h>

《你必须知道的495个C语言问题》笔记--数组和指针

一.如何动态分配多维数组? 1.分配一个指针数组,然后把每个指针初始化为动态分配的行 代码如下: int **array = (int **)malloc(ROW * sizeof(int*)); int i = 0; for(i=0; i<ROW; i++){ array[i] = (int *)malloc(COL * sizeof(int)); } 2.让数组的内容连续,但在后来重新分配行. 代码如下: int **array = (int**)malloc(ROW * sizeof(in

C语言实现使用动态数组实现循环队列

我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作.由于数组的大小已经被指定,无法动态的扩展.所以在这篇博客中,我换成动态数组来实现.动态数组可以不断开辟内存空间,只是会在数组的初始化时有所不同,其他对数组的操作都是一样的.代码上传至 https://github.com/chenyufeng1991/Queue_DynamicArray . (1)声明变量 static int *queue;//声明数组 static int maxSize;//数组大