45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:堆栈问题详解介绍

堆栈问题详解介绍

2016-09-01 02:25:30 来源:www.45fan.com 【

堆栈问题详解介绍

堆栈是一种执行“后进先出”算法的数据结构。
 

堆栈

堆栈是一种执行“后进先出”算法的数据结构。

设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略校现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。

堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。

堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。
堆栈可以用数组存储,也可以用以后会介绍的链表存储。
下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。

#define MAX_SIZE 100
typedef int DATA_TYPE;
struct stack
{
DATA_TYPE data[MAX_SIZE];
int top;
};

empty()函数是将堆栈清空的函数,push()函数是压入堆栈的函数,pop()函数是将数据取出的函数。peek()函数是读栈顶元素的函数。
isEmpty()是判断堆栈是否为空的函数,为空则返回真,否则返回假.
其中DATA_TYPE是堆栈中数据的类型,依据你的问题而定义.比如如果堆栈中存入char型元素,那就定义typedef char DATA_TYPE
typedef int BOOL是在定义一个类似逻辑类型的数据类型,由于c语言中没有逻辑类型, 而且
以下是堆栈全部程序:

#include<stdio.h>
#define MAX_SIZE 100
#define TRUE 1
#define FALSE 0
typedef int DATA_TYPE;
typedef int BOOL;
struct stack
{
DATA_TYPE data[MAX_SIZE];
int top;
};

DATA_TYPE peek(struct stack *sta)
{
return (*sta).data[(*sta).top];
}
void empty(struct stack *sta)
{
(*sta).top = -1;
}

BOOL isEmpty(struct stack *sta)
{
if((*sta).top == -1)
return TRUE;
else
return FALSE;
}

void push(struct stack *sta,DATA_TYPE data)
{
if((*sta).top==MAX_SIZE-1)
printf("堆栈已经满n");
else
(*sta).data[++(*sta).top] = data;
}

DATA_TYPE pop(struct stack *sta)
{
if((*sta).top == -1)
{
printf("堆栈已经空了n");
return -1;
}
else
return (*sta).data[(*sta).top--];
}



void main()
{
struct stack st;
empty(&st);
push(&st,3);
push(&st,5);
push(&st,7);
printf("%dn",pop(&st));
printf("%dn",pop(&st));
printf("%dn",pop(&st));
}


思考题:
堆栈通常用于解析某字符串.请用堆栈来检查某字符串中的括号是否匹配,如果不匹配,输出该不匹配的位置.
比如字符串:a{b(c[d]e)f}就是匹配的,而{99]就是不匹配的.
思路:从字符串中从左到右读取字符,每次读取一个字符,如果发现它是左括号(是"[{("中的一个),就压入堆栈中.当从输入中读到右分隔符(是")}]"中的一个)时,就弹出栈顶的左分隔符,看一看是否匹配,如果它们不匹配(如一个是小括号,另一个是中括号),就报错,输出错误的列是几.如果读到末尾,还一直存在没有被匹配的分隔符,程序也报错.分隔符没有被匹配,表现为把整个字符串都读入后,堆栈中仍有分隔符.
 

本文地址:http://www.45fan.com/a/question/70511.html
Tags: 详解 问题 堆栈
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部