常用数据结构——栈及其应用

队列和栈作为一种最简单最基本的常用数据结构,可以说在许多方面都应用广泛。在程序运行时,他们可以保存程序运行路径中各个点的信息,以便用于回溯操作或其他需要访问已经访问过的节点信息的操作。这里对栈的特点、作用做出描述、并简单地用不同途径实现了栈的基本功能。本文的实现分别用了C语言(不是纯C,仍为cpp文件,仅仅只是采用了C语言中的部分思想)和C++,代码均在GCC编译器下验证通过。



什么是栈?


是一种先进后出(FILO)的数据结构,与上一篇中的队列一样,同为最基础的数据结构之一。队列请参考用数据结构——队列及其应用。详细定义请参考教科书。栈同样作为一种限制性的线性表。操作只能在一端进行,即栈顶。另一端为栈底,不进行操作。在栈顶插入元素的操作称为压栈或进栈(push),删除元素的操作称为出栈(pop)


栈的结构类似于一个箱子,装入东西只能从上面加在最顶上,取出时也只能先取出箱子中最顶上的东西。


基本操作除了出栈,压栈外,还有取栈顶元素,初始化,销毁,判空,判满,清空,遍历等操作,可根据需求定义。类似于队列,栈对应于顺序存储结构和链式存储结构分别为顺序栈和链式栈


C实现


顺序栈在C语言中的实现很简单:

其中栈顶指针top指向栈顶元素。

#include<iostream>
#include<stdlib.h>
#define MaxSize 100
using namespace std;

typedef struct//栈的定义 
{
	char data[MaxSize];//默认字符数组 
	int top;//指针 
}SqStack;
void InitStack(SqStack *&s);//初始化 
void DestroyStack(SqStack *&s); //销毁栈 
bool StackEmpty(SqStack *s);//判空 
bool Push(SqStack *&s,char e);//压栈 
bool Pop(SqStack *&s,char &e); //出栈 
bool GetTop(SqStack *s,char &e);//取得栈顶元素 
int main(void)
{
	SqStack *s;
	InitStack(s);
	DestroyStack(s);

	system("pause");
	return 0;
}
void InitStack(SqStack *&s)
{
	s = (SqStack *)malloc(sizeof(SqStack));
	s->top = -1;
}
void DestroyStack(SqStack *&s)//销毁栈 
{
	free(s);
}
bool StackEmpty(SqStack *s)//判空 
{
	return s->top == -1;
}
bool Push(SqStack *&s,char e)//压栈 
{
	if(s->top == MaxSize-1)//栈满情况 
		return false;
	s->top ++;
	s->data[s->top] = e;//e赋给栈顶 
	return true;
}
bool Pop(SqStack *&s,char &e)//出栈 
{
	if(s->top == -1)//为空 
		return false;
	e = s->data[s->top];
	s->top --;
	return true;
}
bool GetTop(SqStack *s,char &e)//取栈顶元素 
{
	if(s->top == -1)
		return false;
	e = s->data[s->top];
	return true;
}


链式栈在C语言中,采用带头节点的链表实现如下:
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct SNode
{
	int data;
	SNode *next; 
}LinkedStack;//链式栈节点定义 
void InitStack(LinkedStack *&s);//初始化
void DestroyStack(LinkedStack *&s);//销毁栈 
bool StackEmpty(LinkedStack *s);//判空 
void Push(LinkedStack *&s,int e);//压栈/进栈 
bool Pop(LinkedStack *&s,int &e);//出栈 
bool GetTop(LinkedStack *&s,int &e);//get栈顶元素 
int main(void)
{
	LinkedStack *Q;
	InitStack(Q); 
	Push(Q,1);
	Push(Q,2);
	Push(Q,3);
	int a,b;
	Pop(Q,a);
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
程序在VC++ 6下顺利编译通过。 一、 实验目的: (1) 熟练掌握链的基本操作及应用。 (2) 利用链表作为的存储结构,设计实现一个求解迷宫的非递归程序。 二、实验内容: 【问题描述】 以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对信任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 【基本要求】 首先实现一个链表作存储结构的类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如:对于下列数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),……。 【测试数据】 迷宫的测试数据如下:左上角(1,1)为入口,右下角(8,9)为出口。 1 2 3 4 5 6 7 8 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 以方阵形式输出迷宫及其通路。 输出: 请输入迷宫的长和宽:5 5 请输入迷宫内容: 0 1 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 0 0 迷宫的路径为 括号内的内容分别表示为(行坐标,列坐标,数字化方向,方向) (1,1,1,↓) (2,1,2,→) (2,2,1,↓) (3,2,1,↓) (4,2,2,→) (4,3,1,↓) (5,3,2,→) (5,4,2,→) (5,5,0,) 迷宫路径探索成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值