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;
}Stack;

/*
* 初始化一个空栈
*/
void InitStack(Stack* &s);
/*
* 销毁栈
*/
void DestroyStack(Stack* &s);
/*
* 清空栈
*/
void ClearStack(Stack* s);
/*
* 判断栈是否为空
*/
bool StackEmpty(Stack s);
/*
* 获取栈的长度
*/
int StackLength(Stack s);
/*
* 获取栈顶元素
*/
void GetTop(Stack s, ElemType* e);
/*
* 将元素压入栈
*/
void Push(Stack* &s, ElemType e);
/*
* 将元素弹出栈
*/
void Pop(Stack* &s, ElemType* e);
/*
* 打印栈
*/
void PrintStack(Stack* s,FILE* fout);

void InitStack(Stack* &s)
{
    MALLOC(s, sizeof(Stack), Stack*);
    s->top = NULL;
    s->count = 0;
}

void DestroyStack(Stack* &s)
{
    StackNode* sn_tmp_ptr;
    while (s->top){
        sn_tmp_ptr = s->top;
        s->top = s->top->next;
        free(sn_tmp_ptr);
    }
    free(s);

}

void ClearStack(Stack* &s)
{
    while (s->top){
        s->top->data = 0;
        s->top = s->top->next;
    }
}

bool StackEmpty(Stack s)
{
    return s.count<1 ;
}

int StackLength(Stack s)
{
    return s.count;
}

void GetTop(Stack s, ElemType* e)
{
    *e = s.top->data;
}

void Push(Stack* &s, ElemType e)
{
    StackNode* snptr;
    MALLOC(snptr, sizeof(StackNode), StackNode*);
    snptr->data = e;
    snptr->next = s->top;
    s->top = snptr;
    s->count++;

}

void Pop(Stack* &s, ElemType* e)
{
    *e = s->top->data;
    StackNode* sn_tmp_ptr = s->top;
    s->top = s->top->next;
    s->count--;
    free(sn_tmp_ptr);
}

void PrintStack(Stack* s,FILE *fout)
{
    while (s->top){
        fprintf(fout,"%d", s->top->data);
        s->top = s->top->next;
    }
}
void main(){
    FILE *fin, *fout;
    fin = fopen("input.txt", "r");
    fout = fopen("output.txt", "w");
    int tmp = 0;
    while (!feof(fin)){
        fscanf(fin, "%d", &tmp);
        if (tmp != -1){
            fprintf(fout, "%8d--->", tmp);
            Stack *sc = NULL;
            InitStack(sc);
            while (tmp / 2 != 0)
            {
                Push(sc, tmp % 2);
                tmp /= 2;
            }
            Push(sc, tmp);
            PrintStack(sc, fout);
            fprintf(fout, "\n");
            DestroyStack(sc);
        }
    }
    fclose(fin);
    fclose(fout);
    system("pause");
}
时间: 2024-10-11 18:05:37

c语言栈的链表实现的相关文章

数据结构学习——栈的链表实现(程序化)

关于栈的基本概念以及和Catalan数的关系,可以参见我的其他文章 参考资料<数据结构与算法分析--C语言描述> #include<stdio.h> #include<stdlib.h> /*栈的链表实现*/ typedef struct StackNode { struct StackNode *next; int data; }StackNode,*Stack; Stack CreateStack(void);//创建一个空栈 void MakeEmpty(Stac

使用C语言描述静态链表和动态链表

静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链表而言的,一般地,在描述线性表的链式存储结构时如果没有特别说明即默认描述的是动态链表. 下面给出它们的简单实现,关于线性表更为详尽的C语言的实现,可以参考 http://www.cnblogs.com/choon/p/3876606.html 静态链表 #define _CRT_SECURE_NO_

数据结构C语言实现——线性链表

declaration.h #ifndef DECLARATION_H_INCLUDED #define DECLARATION_H_INCLUDED #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define ElemType int typedef ElemType* Triplet; typedef int Status; type

C语言实现单链表节点的删除(带头结点)

我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https://github.com/chenyufeng1991/DeleteLinkedList_HeadNode.删除类型有两种: (1)删除某个位置pos的节点: (2)推断x值是否在链表中,若存在则删除该节点: 核心代码例如以下: //删除某个位置pos的节点 Node *DeletePosNode(Node

顺序栈与链表栈的实现

栈是一种常见的数据结构,它虽然有栈顶和栈底之分,但它只能从一端操作(插入或删除),从而是一种"先进后出"的操作模式.向栈内进数据称为压栈(Push),从栈里取出数据叫出栈(POp).例如压栈顺序为1.2.3.4.5,着出栈的顺序为5.4.3.2.1(只考虑一次性出栈的情况). 栈按照存储的方式,又分为顺序栈和链表栈.顺序栈基于数组实现,所以顺序栈存储数据的内存是连续的,在创建栈时规定好栈的大小,这样对内存的使用效率并不高.而链式栈则是采用了链表来实现,其元素的存储地址是不连续的,而且是

数据结构应用实例#栈&amp;单链表#简易计算器

使用数据结构中的栈以及链表来制作一个能够处理中缀表达式的计算程序. 在该程序中输入的数字可以是任意正数.小数.(忘了添加对负数的支持,尽快补上) 输入的运算符可以是 + - * / ( ) 但请确保输入的表达式合法. 中缀表达式: 形如 9+(3-1)*3+10/2 的数学表达式.特点是运算符在被运算的两个数字中间,也就是我们日常接触的算式. 后缀表达式: 以上面的中缀表达式 9+(3-1)*3+10/2 为例 转换成后缀表达式为 9 3 1-3*+ 10 2/+ 特点是运算符紧跟在被运算的两个

C语言实现单链表的节点插入(带头结点)

我在之前一篇博客<C语言实现单链表(不带头结点)节点的插入>中具体实现了怎样在一个不带头结点的单链表中进行节点的插入.可是在实际应用中,带头结点的链表更为经常使用.更为方便.今天我们就要来使用带头结点的单链表进行节点的插入.演示样例代码上传至 https://github.com/chenyufeng1991/InsertList_HeadNode  . 核心代码例如以下: Node *InsertNode(Node *pNode,int pos,int x){ int i = 0; Node

C语言实现单链表(带头结点)的基本操作

我在之前一篇博客<C语言实现单链表(不带头结点)的基本操作>中具体实现了不带头结点的单链表的11种操作:如计算链表长度.初始化.创建链表.清空链表等等.但是在实际使用中,带头结点的单链表往往比不带头结点的单链表用的更多,使用也更为方便.因为不用单独考虑第一个节点的情况了,第一个节点和其他后续节点的处理全都一样了,简化操作.这篇博客将会来实现带头结点的单链表的11种操作.代码上传至: https://github.com/chenyufeng1991/LinkedList_HeadNode  .

C语言实现单链表-03版

在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4,一个专门遍历数据的功能: Solution 我们的数据结构体定义如下,和上一个版本稍微有所不同: 例如,我们把人这个结构体添加一个name域,前几个版本没有名字的节点: 我们叫起来很尴尬,都是第几个第几个节点,好啦!现在有名字啦! #include <stdio.h> #include <s