C语言中,栈的操作

来源:互联网 发布:mac ps 序列号 编辑:程序博客网 时间:2024/06/10 02:18
#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); //遍历
int pop(PSTACK PS,int *popVal); //popVal为出栈的值,返回值为是否出栈成功
int is_empty(PSTACK PS); //判断栈是否为空
void clear(PSTACK PS);


int main()
{
STACK S;
int popVal;


init(&S); //初始化栈
push(&S,2); //进栈
push(&S,3);
push(&S,4);
push(&S,5);
push(&S,6);
push(&S,7);
traverse(&S); //遍历


pop(&S,&popVal);//出栈
printf("出栈的值是:%d\n", popVal);


clear(&S); //清空


traverse(&S); //遍历
return 0;
}


//初始化栈
void init(PSTACK PS)
{
PNODE p = (PNODE)malloc(sizeof(NODE));
if (p == NULL)
{
printf("动态内存分配失败!\n");
exit(-1);
}


PS->pBottom = p;
PS->pTop = p;
p->pNext = NULL;
}


//进栈
void push(PSTACK PS, int val)
{
PNODE newNode = (PNODE)malloc(sizeof(NODE));
if (newNode == NULL)
{
printf("构建新结点失败!\n");
exit(-1);
}


newNode->data = val;
newNode->pNext = PS->pTop;//newNode指向了pTop指向的结点
PS->pTop = newNode;
}


//遍历
void traverse(PSTACK PS)
{
PNODE temp = PS->pTop;
int i = 0;


while (temp != PS->pBottom)
{
i++;
printf("第%d个元素的值为:%d\n",i,temp->data);
temp = temp->pNext;
}
}


//判断栈是否为空
int is_empty(PSTACK PS)
{
if (PS->pTop == PS->pBottom)
{
return 0;
}
return 1;
}


//出栈

int pop(PSTACK PS, int *popVal)
{
if ( is_empty(PS) == 0)
{
printf("栈是空的,出栈失败!\n");
return 0;
}
PNODE p = (PNODE)malloc(sizeof(NODE));
p = PS->pTop;
PS->pTop = PS->pTop->pNext;
*popVal = p->data;
free(p);
printf("出栈成功!");
return 1;
}


//清空(结构还在,数据清除了,不同于销毁)  结构指的是:构建栈时top和bottom指向同一地址
void clear(PSTACK PS)
{
if (is_empty() == 0)
{
printf("栈为空!不能清空\n");
}
else
{
PNODE p = (PNODE)malloc(sizeof(NODE));


while (PS->pTop != PS->pBottom)
{
p = PS->pTop;
PS->pTop = PS->pTop->pNext;
free(p);
}
printf("清空成功!\n");
}
}
0 0