当前位置:首页 > 新闻中心 > 电气版块 > 详细内容
【C语言_小知识】堆栈的简单操作 及注意事项
发布时间:2014/6/23  阅读次数:2246  字体大小: 【】 【】【

注意事项:
栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表。   
栈是一种数据结构,是只能在某一端插入和删除的特殊线性表。
它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。   
栈是允许在同一端进行插入和删除操作的特殊线性表。
允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。
插入一般称为进栈(PUSH),删除则称为退栈(POP)。 
栈也称为后进先出表(LIFO--Last IN First Out表)。  
栈可以用来在函数调用的时候存储断点,做递归时要用到栈!  

// 堆栈.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "malloc.h"
#include "stdlib.h"

typedef struct linked                        //节点的数据类型
{
        int data;
        struct linked * Pnext;
}NODE,*PNODE;

typedef struct stack                        //链表结构
{
        PNODE top;
        PNODE below;
}Ps,*PS;

/*****************函数声明**********************/
bool init_srack(PS );                //初始化链表
bool empty(PS S);                        //判断是否为空
bool push(PS S,int val);        //将一个数压入堆栈
bool show(PS S);                        //堆栈输出
bool del_plsh(PS S ,int* val1);                //删除1个堆栈
bool del_all(PS S);                        //清空堆栈

/*****************主函数**********************/
int _tmain(int argc, _TCHAR* argv[])
{
        int val1;
        Ps S;                        //创建保存top,和below的节点,注意不能创建指针型变量。
        init_srack(&S);
        empty(&S);
        push(&S,1);
        push(&S,2);
        push(&S,3);
        push(&S,4);
        push(&S,5);
        push(&S,6);
        push(&S,7);
        show(&S);                        //堆栈输出
        del_plsh(&S,&val1);
        show(&S);                        //堆栈输出
        printf("\n____执行全部删除_______\n");
        del_all(&S);
        show(&S);                        //堆栈输出
        printf("\n____执行完成_______\n");

        while(1);
        return 0;
}

/****************初始化堆栈**********************/
bool init_srack(PS S)
{
        PNODE q;
        q=(PNODE)malloc(sizeof(NODE));
        if(q == NULL)
        {
                printf_s("栈创建失败!\n");
                exit(-1);
        }
        else
        {
                q->data = NULL;
                q->Pnext = NULL;
                S->top =q;
                S->below =q;

                printf_s("栈创建成功!\n");
                return true;
        }

}

/****************判断堆栈是否为空**********************/
bool empty(PS S)
{
        if(S->below  == S->top )
        {
                printf_s("\n链表为空!\n");
                return true;
        }
        else 
                return false;
}

/****************将一个数压入堆栈*********************/
bool push(PS S,int val)                        //圧栈1个数
{
        PNODE pnew = (PNODE)malloc(sizeof(PNODE));
        if(pnew == NULL)
        {
                printf_s("程序运行异常终止!");
                exit(-1);
        }
        pnew->data = val;
        pnew->Pnext = S->top;
        S->top = pnew;
        return true;
}

/*****************输出堆栈**********************/
bool show(PS S)                        //堆栈输出
{
        /*
        PNODE p = pS->top;

        while (p != pS->below)
        {
                printf("%d  ", p->data);
                p = p->Pnext;
        }
        printf_s("\n");

        return;*/

        PNODE P;
        P  = S->top ;
        if(empty(S))
        {
                printf_s("\n链表为空,输出失败!\n");
                return true;
        }
        else
        {
                while(P  != S->below )
                {
                        
                        printf_s("%d\t",P->data  );
                        P = P->Pnext ;
                }
                printf_s("\t输出完成!\n");
                return true;
        }
}


/****************出栈一个数*********************/
bool del_plsh(PS S ,int* val1)
{
        PNODE Q;
        if(empty(S))
        {
                 printf_s("链表为空,删除失败!\n");
                 return false;
        }
        else
        {

        //        while(S->top != S->below )
                
                        Q=S->top ;
                        *val1 = Q->data ;
                        S->top = Q->Pnext ;
                        Q= NULL;
                        free(Q);

                
                printf_s("\n删除成功,删除的值是:%d!\n",*val1);
                return true;
        }


}

/*****************清空堆栈*********************/
bool del_all(PS S)
{
        PNODE Q;
        Q=S->top ;
        while(S->top != S->below )
        {

                        S->top = Q->Pnext ;
                        Q= NULL;
                        free(Q);
                        Q=S->top ;
        }
                
                printf_s("\n全部删除成功 !\n");
                return true;
}

 


写代码时出现的问题,自己的感觉有一些地方还是错的,只供交流,有问题可以留言,免得误人子弟:
1.   如果程序有定义结构体数据类型时,函数的声明需要放在所定义的结构体数据类型下面,如果放在所定义的结构体前面则编译的时候会报错!


2.   创建堆栈的时候需先建立一个能存 栈头和栈尾的数据类型 假设是 PS S,

typedef struct stack                        //链表结构
{
        PNODE top;
        PNODE below;
}Ps,*PS;

PS S;


3    需要创建一个空节点;使S->top,和S->below都指向空节点,当S->top==S->below的时候就为空链表
typedef struct linked                        //节点的数据类型
{
        int data;
        struct linked * Pnext;
}NODE,*PNODE;

假设是 PNODE ps;
ps = (PNODE)malloc(sizeof(NODE));


S->top = ps;
S->below =ps;
在这里因为
        PNODE top;
        PNODE below;

当top和below都指向ps的时候堆栈为空,但也是一个完整的栈


4.排错思维不好,代码运行时,栈的初始化,圧栈,遍历,都正常,但加了出栈(将一个数出栈) 后,就有问题,刚开始想的是,可能在输出后,top指向了最后below,就一直改,感觉没什么效果,其实可以试试,如果是在输出的时候改变了top指向的地址,可以在输出一次看看,如果正常输出就不是这个函数的问题,可能就是出栈函数的问题了,对,因为在出栈的时候是出1个数,而在这里误用while循环,while(SS->top != S->belo)   ,将函数全部清空了!


5.思维能力还得加强!


于2014年6月22日

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!


惠州市胜克机电设备有限公司 版权所有

 Copyright By www.hzskjd.com