栈—代码

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

//局部变量在栈里面分配。静态分配都在栈里面分配,动态都在堆里面分派的。

typedef struct Node
{
    int data;
    struct Node *pNext;
}NODE, * PNODE;                //NODE等价于struct Node。PNODE等价于struct Node*

typedef struct Stack
{
    PNODE pTop;
    PNODE pButtom;
}STACK, * PSTACK;//

void init(PSTACK);
void push(PSTACK, int);
void traverse(PSTACK);
bool pop(PSTACK, int *);
void clear(PSTACK);

int main(void)
{
    int val;
    STACK S;
    init(&S);
    push(&S, 1);
    push(&S, 2);
    push(&S, 3);
    push(&S, 4);
    push(&S, 5);
    push(&S, 6);
    push(&S, 7);
    push(&S, 8);
    traverse(&S);
    clear(&S);
    traverse(&S);
    if(pop(&S, &val))
    {
        printf("出栈成功,出栈的元素是%d\n",val);
    }
    else
    {
        printf("出栈失败");
    }
    return 0;
}

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

void push(PSTACK pS, int val)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    pNew->data = val;
    pNew->pNext = pS->pTop;
    pS->pTop = pNew;
    return;
}

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

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

//把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中。如果出栈失败返回false。
bool pop(PSTACK pS, int *pVal)
{
    if(empty(pS))   //pS本身存放的就是S的地址
    {
        return false;
    }
    else
    {
        PNODE q = pS->pTop;
        *pVal = q->data;
        pS->pTop = q->pNext;
        free(q);
        q = NULL;
        return true;
    }
}

//清空数据
void clear(PSTACK pS)
{
    if(empty(pS))
    {
        return;
    }
    else
    {
        PNODE p = pS->pTop;
        PNODE q =NULL;

        while(p !=pS->pButtom)
        {
            q = p->pNext;
            free(p);
            p = q;
        }
        pS->pTop = pS->pButtom;
    }
}
时间: 2024-07-30 06:41:44

栈—代码的相关文章

数据结构之栈代码实现

废话不多说,直接上代码: #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; //栈底 }St

13 一个完整的链栈代码

项目结构: main.cpp: #include <iostream> #include<stdio.h> #include<stdlib.h> #include "function_for_LinkStack.h" using namespace std; int main() { TestLinkStack(); return 0; } function_for_LinkStack.h: #ifndef FUNCTION_FOR_LINKSTAC

HDU 5033 (单调栈维护凸包) Building

题意: 一个人在x轴上,他的左右两侧都有高楼,给出楼的横坐标Xi和高度Hi还有人的位置pos,求人所能看到的天空的最大角度. 分析: 将建筑物和人的位置从左到右排序,对于每个位置利用栈求一次人左边建筑物的凸包,找到一个最小的角度,然后对称一下,再找一个右边的建筑物的最小角度,两个角度加起来就是答案. 将人左边的建筑物从左到右扫描,下面两种情况会出栈: 栈顶元素楼高小于等于当前扫描到的楼高,因此这是一个单调的栈 栈顶两个楼顶所在直线的斜率 小于 栈顶的楼顶和当前楼顶所在直线的斜率(这里的斜率指的是

[转] 函数调用栈

http://kingj.iteye.com/blog/1555017 http://www.cnblogs.com/rain-lei/p/3622057.html 函数调用大家都不陌生,调用者向被调用者传递一些参数,然后执行被调用者的代码,最后被调用者向调用者返回结果,还有大家比较熟悉的一句话,就是函数调用是在栈上发生的,那么在计算机内部到底是如何实现的呢? 对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执

函数调用栈

转自  http://www.cnblogs.com/rain-lei/p/3622057.html 函数调用大家都不陌生,调用者向被调用者传递一些参数,然后执行被调用者的代码,最后被调用者向调用者返回结果,还有大家比较熟悉的一句话,就是函数调用是在栈上发生的,那么在计算机内部到底是如何实现的呢? 对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写 数据段:保存初始化的全局变量和静态变量,可读可写不可执

【数据结构之旅】顺序栈的定义、初始化、空栈判断、入栈、出栈操作

说明: 往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉.下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了. 一.实现 1.程序功能 关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换. 2.预定义.头文件导入和类型别名 代码如下: #i

【LeetCode-面试算法经典-Java实现】【225-Implement Stack using Queues(用队列实现栈操作)】

[225-Implement Stack using Queues(用队列实现栈操作)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 代码下载[https://github.com/Wang-Jun-Chao] 原题 Implement the following operations of a stack using queues. push(x) – Push element x onto stack. pop() – Removes the element on

POJ1363【栈】

Description There is a famous railway station in PopPush City. Country there is incredibly hilly. The station was built in last century. Unfortunately, funds were extremely limited that time. It was possible to establish only a surface track. Moreove

5,用两个栈实现队列《剑指offer》

题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 栈的特性:先进后出 队列的特:先进先出 将栈1的内容全都弹出,然后推入栈2,弹出栈2 达到先进先出的功能:所以分为push栈 和 pop 栈 代码: class Solution { public: void push(int node) { stack1.push(node); } int pop() { int result; if(stack2.empty()){ while(!stack