栈的操作(创建,入栈,出栈,清空,遍历等等)

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

typedef struct Node

{

int data;

struct Node *pNext;

}NODE,*PNODE;

typedef struct Stack

{

PNODE pTop;

PNODE pBottom;

}STACK,*PSTACK;

void init(PSTACK pS);

void push (PSTACK pS,int val);

void traverse(PSTACK pS);

bool pop(PSTACK pS,int * pVal);

bool empty(PSTACK pS);

void clear(PSTACK pS);

int main()

{

STACK S;

int val;

init(&S);//造出一个空栈

for(int i=0;i<=15;i++)

{

push(&S,i);

}

/*

push(&S,1);//压栈

push(&S,3);

push(&S,4);

push(&S,5);

push(&S,13);

push(&S,11);

*/

traverse(&S);//遍历输出

//出栈

//pop(&S,&val);

if(pop(&S,&val))

{

printf("出栈成功,出栈的元素是%d\n",val);

}

else

{

printf("出栈成功");

}

traverse(&S);//遍历输出

//traverse(&S);//遍历输出

clear(&S);//清空

if(empty(&S))

{

printf("栈为空\n ");

}

else

{

printf("栈为非空\n");

}

return 0;

}

void init(PSTACK pS)

{

pS->pTop=(PNODE)malloc(sizeof(NODE));

if(NULL==pS->pTop)

{

printf("动态内存分配失败");

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;

pNew->pNext=pS->pTop;

pS->pTop=pNew;

return;

}

void traverse(PSTACK pS)

{

PNODE p=pS->pTop;

while(p!=pS->pBottom)

{

printf("%d  ",p->data);

p=p->pNext;

}

printf("\n");

}

bool empty(PSTACK pS)

{

if(pS->pTop==pS->pBottom)

{

return true;

}

else

{

return false;

}

}

bool pop(PSTACK pS,int * pVal)

{

if(empty(pS))//pS存放的就是栈的地址

{

return true;

}

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;

PNODE q=NULL;

while(p!=pS->pBottom)

{

q=p->pNext;

free(p);

p=q;

}

pS->pTop=pS->pBottom;

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-29 03:41:10

栈的操作(创建,入栈,出栈,清空,遍历等等)的相关文章

在堆栈中,push为入栈操作,pop为出栈操作

LinkedList提供以下方法:(ArrayList无此类方法) addFirst(); removeFirst(); addLast(); removeLast(); 在堆栈中,push为入栈操作,pop为出栈操作. Push用addFirst():pop用removeFirst(),实现后进先出. 用isEmpty()--其父类的方法,来判断栈是否为空. 在队列中,put为入队列操作,get为出队列操作. Put用addFirst(),get用removeLast()实现队列. 1 pac

栈和队列----用递归函数和栈的操作实现逆序一个栈

用递归函数和栈的操作实现逆序一个栈 一个栈依次压入1.2.3.4.5,那么从栈顶到栈底分别为5.4.3.2.1,将这个栈转置后,从栈顶到栈底为1.2.3.4.5,也就是实现栈中元素的逆序,但是只能使用递归函数来实现,不能实现其他数据结构. package com.test; import java.util.Stack; /** * Created by Demrystv. */ public class ReverseStack { //将栈stack的栈底元素返回并且删除 private s

多栈共享技术,双端栈的初始化、进栈、出栈操作

栈的应用非常广泛,经常会出现一个程序中需要同时使用多个栈的情况.若使用顺序栈,会因为对栈空间大小难以准确估计,从而产生有的栈溢出.有的栈空间还很空闲的情况.为了解决这个问题,可以让多个栈共享一个足够大的数组空间,通过利用栈的动态特性来使其存储空间互相补充,这就是多栈的共享技术. 在顺序栈的共享技术中,最常用的是两个栈的共享技术,即双端栈.它主要利用了栈的栈底位置不变,而栈顶位置动态变化的特性. 实现代码如下: #include<iostream> using namespace std; #d

c语言将2进制数转化为10进制数(栈的初始化,进栈,出栈)

1 //c语言描述 将2进制转化为10进制 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #define STACK_INIT_SIZE 20 6 #define //栈满后再分配 7 8 typedef char ElemType; 9 typedef struct 10 { 11 ElemType *base; //栈底 12 ElemType *top; //栈底 13 int s

C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)

/**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋值*/ #include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define OK 1#define ERROR 0#define NAMESIZE 255//字符串的最大长度

两栈共享空间的存储结构和入栈出栈操作

参考<大话数据结构>P95~96——两栈共享存储空间. 当两个栈的需求空间有相反关系时,也就是一个栈增长时,另一个栈在缩短,可以采用两栈共享空间结构.这是针对两个具有相同数据类型的栈的一个设计技巧. 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 #define MAXSIZE 6 //本例中栈满共6个元素 6 typed

栈、堆内存到底是如何申请的,方法是如何入栈出栈的——内存结构理解学习

Lee出品,转载请注明出处http://blog.csdn.net/hnulwt/article/details/42934365 对于软件开发者而言,理解和熟悉计算机内存知识是很基础的.今天我就来翻翻旧账,回顾看看有哪些点遗漏了,在此共同学习. 提起内存,我们常常想到三个区域: 1,静态区,静态变量 static variables / constant  ,常量,静态变量就存储在静态区域,这个区域比较简单,只需要知道怎么通过地址访问他就行了. 2,堆,也叫堆栈(这里要注意堆栈 和 栈 是不同

元素出栈,入栈顺序的合法性。如入栈的序列(1,2,3,4,5)。出栈序列为(4,5,3,2,1)

元素出栈,入栈顺序的合法性.如入栈的序列(1,2,3,4,5).出栈序列为(4,5,3,2,1) 思路: 1)如果当前栈为空,且入栈序列不空,则入栈序列的下一个元素入栈: 2)如果当前辅助栈的栈顶元素不等于出栈序列的首元素,那么入栈序列一直入栈,直到入栈序列为空. 3)如果当前辅助栈的栈顶元素等于出栈序列的首元素,那么栈顶元素弹出,出栈序列第一个元素移走: 4) 如果入栈序列为空,出栈序列第一个元素仍然不等于栈顶元素,则表示2个序列是不匹配的. 下面用图说明 开始栈为空 入栈序列第一个元素入栈后

剑指Offer20 栈的压入弹出序列是否正确

1 /************************************************************************* 2 > File Name: 20_IsPopOrder.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月30日 星期二 19时53分19秒 6 **************************************

给定入栈顺序,判断出栈顺序是否合法

题目描述:给定一个入栈序列,给定一个出栈序列,判断该出栈序列是否合法. 分析:假如入栈序列为1 2 3 4 5,判断4 5 3 2 1 是否是合法的出栈顺序. 两个序列均以数组的形式给出 从两个数组的第一个元素开始,如果栈为空,或者,栈顶元素不等于当前出栈数组当前下标对应的元素时,将当前入栈数组中下标所指向的元素进行压栈 初始状态如下: 步骤1:把 1 进行压栈,并将下标后移,如下图所示, 步骤2:依次进行判断并压栈,当4进栈后,此时栈顶元素等于出栈数组下标所指向的元素,将4出栈,如下图所示 步