注意事项:
栈(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日
|