C语言,栈的实现

一、动态栈的实现

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//定义一个节点的结构
typedef struct node
{
    int member;                             //数据域
    struct node *pNext;                     //指针域
}Node,*pNode;
//定义一个栈结构
typedef struct stack
{
    pNode Top;                              //栈顶
    pNode Bottom;                           //栈底
}Stack,*pStack;

void initStack(pStack);                       //初始化栈
bool push(pStack,int);                        //压栈操作
void traverseStack(pStack);                   //遍历栈
bool empty(pStack);                           //判断栈是否为空
int pop(pStack);                              //出栈操作
void clear(pStack);                           //清空栈

int main(void)
{
    Stack s;                        //    定义一个栈
    int i;
    int num;
    int data;                        //    临时保存用户输入的数据
    int re_num;                        //    保存Pop函数的返回值
    initStack(&s);
    printf("你想输入几个数据啊:");
    scanf("%d",&num);
    for (i = 0;i < num;i++)
    {
        printf("第 %d 个数:",i+1);
        scanf("%d",&data);
        if (push(&s,data))                //    调用Push函数
        {
            continue;
        }
        else
        {
            printf("进行进栈操作失败!\n");
            exit(-1);
        }
    }
    traverseStack(&s);                //    调用遍历函数
    printf("你想去掉几个数啊: ");
    scanf("%d",&data);
    printf("你去掉的数字是:");
    for (i = 0; i < data;i++)
    {
        re_num = pop(&s);            //    调用Pop函数,并把返回值赋给re_num;
        printf("%d ",re_num);
    }
    printf("看看删除后还有啥:");
    traverseStack(&s);
    printf("\n");
    clear(&s);                        //    调用清空栈函数
    printf("遍历下看看栈清空没····\n");
    traverseStack(&s);
    printf("\n");

    return 0;
}

//栈的初始化操作
void initStack(pStack ps)
{
    ps->Top = (pNode)malloc(sizeof(Node));   //分配内存空间给栈顶
    if(NULL == ps->Top)
    {
        printf("动态内存分配失败!\n");
        exit(-1);
    }
    else
    {
        ps->Bottom = ps->Top;               //使栈底也指向栈顶空间
        ps->Top->pNext = NULL;              //栈顶指针置为NULL
    }
    return;
}

//压栈操作函数
bool push(pStack ps,int data)
{
    pNode pNew = (pNode)malloc(sizeof(Node));  //定义一个新节点,并分配内存空间
    if(NULL == pNew)
    {
        return false;
    }

    pNew->member = data;                       //把要进栈的数据赋给新节点的member成员
    pNew->pNext = ps->Top;                     //使新节点的指针指向栈顶
    ps->Top = pNew;                            //把新节点作为新栈顶
    return true;
}

//遍历栈的函数
void traverseStack(pStack ps)
{
    pNode pNew = ps->Top;
    while(pNew != ps->Bottom)       //栈顶不等于栈底,循环
    {
        printf("%d ", pNew->member);//打印栈顶成员member
        pNew = pNew->pNext;         //栈顶指针指向下一个节点
    }
    return;
}

//判断栈是否为空
bool empty(pStack ps)
{
    if(ps->Top == ps->Bottom)    //如果栈顶等于栈底,表示栈中没有数据
    {
        return true;
    }
    else
    {
        return false;
    }
}

//出栈操作函数
int pop(pStack ps)
{
    pNode pSwap = NULL;
    int val;
    if(empty(ps))                 //判断栈是否为空,如果是空栈,就不能进行出栈操作
    {
        exit(-1);
    }
    else
    {
        val = ps->Top->member;    //把栈顶的成员member的值赋给val做为函数的返回值
        pSwap = ps->Top;          //使pSwap指向栈顶
        ps->Top = ps->Top->pNext; //使栈顶指向栈顶的下一个节点
        free(pSwap);              //释放以前的栈顶空间
        return val;
    }
}
//清空栈的函数
void clear(pStack ps)
{
    pNode pNew = NULL;
    while(ps->Top != ps->Bottom)   //栈顶和栈底不等,循环
    {
        pNew = ps->Top;            //把栈顶赋给新节点
        ps->Top = ps->Top->pNext;  //使栈顶指向栈顶的下一个节点
        free(pNew);                //释放以前的栈顶空间
    }
    ps->Top = ps->Bottom;
    return;
}

C语言,栈的实现

时间: 2024-08-01 10:45:04

C语言,栈的实现的相关文章

C语言栈队列实现二-十/二-八进制转换

C语言栈队列实现二-十/二-八进制转换 2015-04-05 Lover雪儿 1 //利用栈来求取二进制数的十进制与八进制的结果 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h> 5 6 #define STACK_INIT_SIZE 20 //初始栈大小 7 #define STACK_INCREMENT 10 //扩充栈时每次增加的内存 8 9 typedef char ElemType;

C语言栈调用机制初探

学习linux离不开c语言,也离不开汇编,二者之间的相互调用在源代码中几乎随处可见.所以必须清楚地理解c语言背后的汇编结果才能更好地读懂linux中相关的代码.否则会有很多疑惑,比如在head.s中会看到调用main函数,在调用之前会看到几次压栈行为,在<linux内核完全注释>一书中会看到这几句汇编后面的注释说是为main函数的参数进行压栈,可是查看main的代码发现main函数根本不需要任何参数,这里为什么会有几次压入参数的动作呢?再比如fork函数中会看到有众多参数,但在调用这时却没有看

【数据结构】C语言栈的基本操作

#include<stdio.h> #include<stdlib.h> #include<malloc.h> //定义节点 struct Node { int data; struct Node *next; }; typedef Node StackNode; //定义栈 struct Stack { StackNode *top; StackNode *base; }; typedef Stack SqStack; //定义创建栈的函数 int InitStack

c语言栈的链表实现

#include <stdio.h> #include <stdlib.h> #include"PublicDS.h" typedef int ElemType; //定义栈节点的结构 typedef struct StackNode{ ElemType data; struct StackNode* next; }StackNode; //定义栈的结构 typedef struct Stack{ StackNode* top; int count; }Stac

C语言栈的实现

static.h #define STATIC_INIT_SIZE 100#define STATICINCREMENT 10#define ERROR 0#define OK 1typedef struct { int *base;//定义栈底 int *top;//定义栈顶元素 int staticsize; }SqStatic; typedef int Status; //初始化一个空栈Status InitStatic(SqStatic *S); //销毁栈Status DestroyS

C语言—栈

栈的操作:进栈和出栈 1 #include "stdafx.h" 2 #include "stack.h" 3 #define maxsize 20 4 typedef int Elemtype; 5 6 /*顺序存储—数组形式*/ 7 struct stack 8 { 9 int data[maxsize]; 10 int top; 11 }; 12 13 void init(struct stack *ps) 14 { 15 ps->top = -1; 1

C语言 栈的初始化,入栈,出栈,判断栈是否为空,清空栈等函数

#include <stdio.h>#include <stdlib.h> typedef struct Node{ int data ; struct Node * pNext;}*PNODE ,NODE ; typedef struct stack{ PNODE pTop; PNODE pBottom;}*PSTACK ,STACK;void init(PSTACK pS);void push(PSTACK pS,int val);void show(PSTACK pS);bo

Rust这个新的语言

Rust初步(七):格式化 摘要: 在Rust中,如果要进行屏幕输出,或者写入到文件中,需要对数据进行格式化.这一篇总结一下它所支持的几种格式化方式. 这篇文章参考了以下官方文档,不过,按照我的风格,我还是会突出于C#语言的比较,这样可能更好懂一些. http://rustbyexample.com/hello/print.html http://doc.rust-lang.org/std/fmt/ http://rustbyexa...阅读全文 posted @ 2015-08-27 13:0

JVM的本地方法栈

对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区.当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界.本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,但不止如此,它还可以做任何它想做的事情. 本地方法本质上时依赖于实现的,虚拟机实现的设计者们可以自由地决定使用怎样的机制来让Java程序调用本地方法. 任何本地方法接口都会使用某种本地方法栈.当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈.然而当它调用的是本地方法时,虚

【干货】微服务技术栈选型手册2.0

一.前言 2014年可以认为是微服务1.0的元年,当年有几个标志性事件,一是Martin Fowler在其博客上发表了"Microservices"一文,正式提出微服务架构风格:二是Netflix微服务架构经过多年大规模生产验证,最终抽象落地形成一整套开源的微服务基础组件,统称NetflixOSS,Netflix的成功经验开始被业界认可并推崇:三是Pivotal将NetflixOSS开源微服务组件集成到其Spring体系,推出Spring Cloud微服务开发技术栈. 一晃三四年过去,