/************************************************************************/
/* 数据结构:栈基本操作:进栈、出栈、打印栈 */
/* 挑灯看剑-shuchangs@126.com 2010-10 */
/* 云歌国际(Cloud Singers International) www.cocoral.com */
/************************************************************************/
#include <stdio.h>
#include <malloc.h>
#include "core.h"
//结点数据结构
typedef struct NODE
{
int data;
struct NODE* next;
struct NODE* prior;
}Node, * NodePointer;
//栈元数据结构
typedef struct STACK
{
int len;
struct NODE* top;
struct NODE* base;
}Stack, * StackPointer;
void main()
{
//*************函数原型******************
Status StackIn(StackPointer SP, int e);
void autoStack(StackPointer SP, int n);
void StackPrint(Stack S, char tag);
Status StackOut(StackPointer SP, NodePointer NP);
//*************函数原型******************
Stack S =
{
0, NULL, NULL
};
Node N =
{
0, NULL, NULL
};
int i = 0;
autoStack(&S, 10);
StackPrint(S, 'b');
for (i = 0; i <= 11; i++)
{
StackOut(&S, &N);
if (N.next == NULL && N.prior != NULL)
{
printf("删除结点值:%d,前驱结点值:%d\n", N.data, N.prior->data);
}
else
{
printf("删除结点值:%d\n", N.data);
}
StackPrint(S, 'b');
}
//StackPrint(S,'b');
}
//进栈操作,结点作为栈顶元素入栈
Status StackIn(StackPointer SP, int e)
{
static Status StackIsEmpty(Stack S);//函数原型
Status status = ERROR;
NodePointer p = NULL;//遍历指针,非游离指针
NodePointer NP = (NodePointer) malloc(sizeof(Node));
NP->data = e;
//进行预处理
if (!StackIsEmpty(*SP))
{
//将结点追加为栈顶元素
p = SP->top; //p指向栈顶
p->next = NP;
NP->prior = p;
NP->next = NULL;
SP->top = NP;
SP->len += 1; //长度加1
//puts("进栈成功!");
status = OK;
}
else
{
SP->base = SP->top = NP;
NP->next = NP->prior = NULL;
SP->len = 1; //长度为1
//puts("进栈成功!");
status = OK;
}
return status;
}
//自动化栈
void autoStack(StackPointer SP, int n)
{
COUNT i = 0;
for (i = 0; i < n; i++)
{
if (StackIn(SP, i))
{
}
else
{
break;
}
}
}
static Status StackIsEmpty(Stack S)
{
if (S.len == 0 || S.base == NULL || S.top == NULL)
return TRUE;
else
return FALSE;
}
//出栈操作,并用结点返回该值
Status StackOut(StackPointer SP, NodePointer NP)
{
Status status = ERROR;
NodePointer p = SP->top; //p指向栈顶
if (!StackIsEmpty(*SP))
{
if (SP->len == 1)
{
SP->base = SP->top = NULL;
SP->len = 0; //长度为0
NP->data = p->data;
NP->next = p->next;
NP->prior = p->prior;
//puts("出栈成功!");
status = OK;
}
else
{
p->prior->next = NULL;
SP->top = p->prior;
SP->len -= 1; //长度减1
NP->data = p->data;
NP->next = p->next;
NP->prior = p->prior;
//puts("出栈成功!");
status = OK;
}
}
else
{
//puts("出栈失败!栈为空!");
status = ERROR;
}
free(p); //p为游离结点,最后释放p内存
return status;
}
//栈打印操作,tag参数IN SET{'B','T'}
void StackPrint(Stack S, char tag)
{
static Status StackIsEmpty(Stack S);//函数原型
NodePointer p = NULL;
COUNT i = 1;
COUNT n = S.len;
printf("栈长度:%d\n", n);
if (!StackIsEmpty(S)) //如果线性链表非空
{
switch (tag)
{
case 'B':
p = S.base;
puts("打印结点信息(栈底到栈顶):");
for (i = 1; i <= n; i++)
{
printf("Node[%d] = %d\n", i, p->data);
p = p->next;
}
break;
case 'b':
p = S.base;
puts("打印结点信息(栈底到栈顶):");
for (i = 1; i <= n; i++)
{
printf("Node[%d] = %d\n", i, p->data);
p = p->next;
}
break;
case 'T':
p = S.top;
puts("打印结点信息(栈顶到栈底):");
for (i = n; i >= 1; i--)
{
printf("Node[%d] = %d\n", i, p->data);
p = p->prior;
}
break;
case 't':
p = S.top;
puts("打印结点信息(栈顶到栈底):");
for (i = n; i >= 1; i--)
{
printf("Node[%d] = %d\n", i, p->data);
p = p->prior;
}
break;
default:
puts("打印失败!");
break;
}
}
else //如果栈为空
{
puts("打印失败!栈为空!");
}
free(p);//p为游离结点,最后释放p内存
}
分享到:
相关推荐
数据结构实验报告 顺序栈操作验证(参考) 专业: 学号: 姓名: 一、顺序栈操作验证 1. 实验目的 掌握栈的顺序存储结构; 验证栈的操作特性; 掌握栈的基本操作实现方法。 2. 实验内容 建立含有若干个元素的顺序栈...
数据结构 顺序栈基本操作
本文主要介绍了如下栈的基本操作 初学者可参考 包括构造 销毁栈 置为空栈 初始栈 查找栈顶元素 删除栈顶元素 从栈底到栈顶依次访问栈中每个元素
数据结构与算法:栈队列的题库
包含数据结构的基本操作--还有主函数..
有关顺序栈的基本操作算法,分别编写栈初始化、入栈、出栈取栈顶元素等与本实验有关的实现顺序基本操作的函数以及括号匹配判断函数
3.掌握栈和队列的逻辑结构特点、顺序存储结构、链式存储结构、顺序栈和链栈的结构体类型定义、循环队列和链队列的结构体类型定义、栈和队列在两种存储结构上的各种基本操作的实现算法。 4.将任意十进制数转换为三种...
数据结构C++版--栈的实现及基本操作 程序代码是自己写的,但算法及思想都来源于网上……
数据结构顺序栈的基本操作,包括删除,查找,入栈,出栈,输出,输入栈
该代码主要完成数据结构中关于栈的一些操作函数,包括初始化栈,压栈,出栈等操作,本代码还对栈的具体应用给予举例,来完成进制数据之间的转换,包括将十进制数转换为二进制数和八进制数,希望对学习数据结构的同志...
数据结构之栈和队列基本操作及实践
《数据结构》课程第三次实验报告 实验报告(三) "姓名 " "学号 " "班级 " " "实验名称 "顺序栈的基本操作 "实验日期 " "机房 " " "实验报告 " "1. 说明自己在实验操作过程中遇到的难点及解决方法 " "难点: " "1....
1.初始化栈; 2.将元素10,20,30,40,50,60,70,80,90入栈; 3.将元素90出栈; 4.取此时的栈顶元素。
正在学习数据结构,很多程序很繁琐,自己总结的链式栈的基本操作,传上来,希望能够帮到大家
1) 根据栈数据结构,分别建立一个顺序栈和链式栈并实现其上基本操作(出栈和入栈等)
数据结构-栈的基本操作-代码
栈(Stack)和队列(Queue)是数据结构中常用的两种基本数据结构。栈是一种后进先出(Last In First Out, LIFO)的数据结构,只允许在栈顶进行插入和删除操作;而队列是一种先进先出(First In First Out, FIFO)的...
数据结构:顺序栈的基本操作,符合国内oj检验
输入字符#,执行一次出队操作,屏幕上显示出队字符;输入字符@,队列中所有字符依次出队并按出队次序在屏幕上显示各字符;输入其它字符,则输入的字符入队。 要求采用队头/队尾间隔至少一个空闲元素的方法来实现循环...