C语言实现栈的基本操作

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

typedef struct Node
{
    int data;
    struct Node * pNext;
}NODE, * PNODE;

typedef struct Stack
{
    PNODE pTop;
    PNODE pBottom;
}STACK, * PSTACK;     //PSTACK等价于struct STACK *

void init(PSTACK); //初始化栈
void push(PSTACK, int );  //压栈
void traverse(PSTACK);    //遍历
bool pop(PSTACK pS,int * pVal);   //出栈
void clear(PSTACK pS);    //清空栈

int main(void)
{
    STACK S;  //STACK等价于struct Stack
    int val;
    init(&S);  //造出空栈
    
    push(&S, 1);  //压栈
    push(&S, 2);
    push(&S, 3);
    push(&S, 4);
    push(&S, 5);
    push(&S, 6);
    
    traverse(&S); //遍历输出
/*
    if(pop(&S,&val))
    {
        printf("出栈成功,出栈的元素是%d\n", val);
    }
    else
    {
        printf("出栈失败!\n");
    }
*/    
    clear(&S);
    traverse(&S);
    
    return 0;
}

void init(PSTACK pS)
{
    pS->pTop = (PNODE)malloc(sizeof(NODE));
    if(NULL == pS->pTop)
    {
        printf("动态内存分配失败\n");
        exit(-1);
    }
    else
    {
        pS->pBottom = pS->pTop;
        pS->pTop->pNext = NULL;
    }
}

void push(PSTACK pS, int val)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));  //创建新的节点
    pNew->data = val;  //将val的值赋给新节点的数据域
    pNew->pNext = pS->pTop; //将新节点的指针域指向下一个节点.pS->Top不能改写成pS->Bottom
    pS->pTop = pNew; //pTop指向新节点
    return;
}

void traverse(PSTACK pS)
{
    PNODE p = pS->pTop;
    while(p != pS->pBottom)
    {
        printf("%d ", p->data);
        p = p->pNext;
    }
    printf("\n");
    return;
}

bool empty(PSTACK pS)
{
    if(pS->pTop == pS->pBottom)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool pop(PSTACK pS,int * pVal)
{
    if(empty(pS))
    {
        return false;
    }
    else
    {
        PNODE r = pS->pTop;
        *pVal = r->data;
        pS->pTop = r->pNext;
        free(r);
        r = NULL;
        return true;
    }
}

//清空栈
void clear(PSTACK pS)
{
    if(empty(pS))        //如果
    {
        return;
    }
    else
    {
        PNODE p = pS->pTop;  //定义元素p指向栈顶元素
        PNODE q = NULL;     //定义元素q,初始值为空
        
        while(p !=pS->pBottom)    //如果栈不为空
        {
            q = p->pNext;        //q指向p的下一个元素
            free(p);            //释放p所指向的栈顶元素
            p = q;               //将q所指向的元素赋给p
        }
        pS->pTop = pS->pBottom;      
    }
}
时间: 2024-12-13 09:34:15

C语言实现栈的基本操作的相关文章

c语言描述-栈的基本操作

一朵花儿开,就有一朵花儿败,满山的鲜花,只有代码最可爱 栈的顺序存取 #include<stdio.h> #include <stdlib.h> #define MAXSIZE 100 //定义最大存储空间 #define STACKINCREMENT 10 //增加的存储空间,increment意为:加薪.增值 typedef struct { int *base; int *top; int sum; //记录元素个数 int stacksize; }Stack; //初始化栈

数据结构之---c语言实现栈及其操作

//c语言实现栈及其基本操作 //杨鑫 #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 typedef int ElementType; typedef struct node { ElementType data; struct node *next; }StackNode, *LinkStack; void init_stack(LinkStack top) { top->next

栈(一)——栈的基本操作

1.栈的简介 栈是一种后入先出的数据结构,一般包含两种最基本的操作:入栈(push)和出栈(pop). 入栈操作:top指针上移,元素入栈. 出栈操作:top指针下移. 栈空的条件:top == bottom 栈满的条件:top == maxsize-1 2.有数据序列1 2 3一次存入一个栈stack中,则出栈顺序可以为以下四种: 1,2,3: 2,1,3: 3,2,1: 1,3,2. 3.任意输入一个十进制整数x(x<32768),输出x的二进制值. #include <stdio.h&g

打印菜单界面,用c语言实现二叉树的基本操作

打印菜单界面,用c语言实现二叉树的基本操作: 其代码原理和用c++实现一样,请看本人上篇博客:二叉树的先序.中序.后序遍历等基本操作c++实现,链接:http://yaoyaolx.blog.51cto.com/10732111/1783527 实现代码: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 50 //定义二叉树的二叉链表结构 typedef struct Node { char data; struct N

3_顺序栈的基本操作

/****date:2014.12.08*****/ /***顺序栈的基本操作***/ /*** Last in First out ( LIFO ) ***/ 顺序栈:使用地址连续的内存单元依次保存栈中的数据,可以定义一个指定大小的结构数组来作为栈:栈底元素序号为0,栈顶元素序号为Top: 栈内元素遵循"后进先出"(LIFO)原则:只能在栈的一端进行操作,即在栈顶位置对栈内元素进行操作. 刚明白的道理:getchar() 对于 键盘的所有操作都算在内,敲击  回车键  也算一个输入信

C语言函数调用栈(三)

6 调用栈实例分析 本节通过代码实例分析函数调用过程中栈帧的布局.形成和消亡. 6.1 栈帧的布局 示例代码如下: 1 //StackReg.c 2 #include <stdio.h> 3 4 //获取函数运行时寄存器%ebp和%esp的值 5 #define FETCH_SREG(_ebp, _esp) do{ 6 asm volatile( 7 "movl %%ebp, %0 \n" 8 "movl %%esp, %1 \n" 9 : "

【数据结构】用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等)

//[数据结构]用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等) //头文件 #ifndef _SEQ_STACK_ #define _SEQ_STACK_ #include <iostream> using namespace std; template <class Type> class SeqStack { public: SeqStack(size_t sz=INIT_SIZE) { capacity = sz > INIT_SIZE ? sz

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,*p

链栈的基本操作

链栈的基本操作实现代码如下: #include<iostream> using namespace std; #define TRUE 1 #define FALSE 0 //链栈的结构 typedef struct node { int data; struct node *next; }LinkStackNode; typedef LinkStackNode *LinkStack; //链栈进栈 int Push(LinkStack top, int x)//将数据元素x压入栈top中 {