加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

数据结构------栈和队列

发布时间:2020-12-15 04:48:16 所属栏目:百科 来源:网络整理
导读:?栈 顺序栈 栈在使用时,所需最大空间的大小很难估计,在初始化设空栈时,不应该限定栈的最大容量。 做法为:先为栈分配一个基本容量,使用过程中,当栈的空间不够使用时再逐段扩大。 STACK_INIT_SIZE? 储存空间初始分配量 STACKINCREAMENT? 存储空间分配增

?栈

顺序栈

栈在使用时,所需最大空间的大小很难估计,在初始化设空栈时,不应该限定栈的最大容量。

做法为:先为栈分配一个基本容量,使用过程中,当栈的空间不够使用时再逐段扩大。

STACK_INIT_SIZE? 储存空间初始分配量


STACKINCREAMENT? 存储空间分配增量

#include

#include

/*堆栈的基本操作*/

struct Stack{

int data;

struct Stack * next;

};

typedef struct Stack * link;

typedef struct Stack Snode;

/*初始化栈*/

link init(){

link p;

p = (link)malloc(sizeof(Snode));

p = NULL;

return p;

}

/*入栈*/

link push(link Head,int x){

link p;

p = (link)malloc(sizeof(Snode));

if (p == NULL){

printf("分配内存失败n");

return Head;

}

p->data = x;

p->next = Head;

return p;

}

/*出栈*/

link pop(link Head){

link p;

p = Head;

if (p == NULL){

printf("栈为空n");

}

else{

p = p->next;

free(Head);

}

return p;

}

/*取栈顶元素*/

int gettop(link Head){

if (Head == NULL){

printf("栈为空n");

return -1;

}

else{

return Head->data;

}

}

/*判断栈是否为空*/

int empty(link Head){

if (Head == NULL){

return 1;

}

else

return 0;

}

/*显示栈元素*/

void display(link Head){

link p;

p = Head;

if (p == NULL){

printf("栈为空n");

}

else{

do{

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

p = p->next;

} while (p != NULL);

}

}

/*释放栈*/

link setnull(link Head){

link p;

p = Head;

while (p != NULL){

p = p->next;

free(Head);

Head = p;

}

return Head;

}

int main(){

int i,x;

link head1;

head1 = init();

int n = 0;

//link q = (link)malloc(sizeof(Snode));

scanf("%d",&n);

for (i = 0; i < n; i++){

scanf("%d",&x);

head1 = push(head1,x);

}

head1 = pop(head1);

printf("栈顶元素为:%dn",gettop(head1));

if (empty(head1) == 1){

printf("栈为空n");

}

else

printf("栈不为空n");

display(head1);

display(setnull(head1));

return 0;

}

队列

#include

#include

#include

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define MAXSIZE 20

typedef int Status;

typedef int QElemType;

typedef struct QNode{

QElemType data;

struct QNode *next;

}QNode,*QueuePtr;

//队列的链表结构

typedef struct{

QueuePtr front;//队头

QueuePtr rear;//对尾

}LinkQueue;

Status visit(QElemType e){

printf("%d ",e);

return OK;

}

//初始化空的队列

Status InitQueue(LinkQueue *Q){

Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));

if(!Q->front)

exit(OVERFLOW);

Q->front->next =NULL;

return OK;

}

//销毁队列

Status DestroyQueue(LinkQueue *Q){

while(Q->front){

Q->rear=Q->front->next;//从队头开始销毁

free(Q->front);

Q->front = Q->rear;

}

return OK;

}

//清空队列,队头指针还在

Status ClearQueue(LinkQueue *Q){

QueuePtr p,q;

Q->rear =Q->front;//跟初始状态相同,Q->rear指向头结点

p=Q->front->next;//开始销毁队头元素,队头,对尾依然保留

Q->front->next =NULL;

while(p){

q=p;

p=p->next;

free(q);

}

return OK;

}

//队列是否空

Status QueueEmpty(LinkQueue Q){

if(Q.front == Q.rear)

return TRUE;

else

return FALSE;

}

//取队列长度

int QueueLength(LinkQueue Q){

int i=0;

QueuePtr p = Q.front;

while(Q.rear != p){

i++;

p = p->next;

}

return i;

}

//获取队头元素

Status GetHead(LinkQueue Q,QElemType *e){

QueuePtr p;

if(Q.front == Q.rear)//队空

return ERROR;

p=Q.front->next;

*e = p->data;

return OK;

}

//对尾插入元素

Status EnQueue(LinkQueue *Q,QElemType e){

QueuePtr s = (QueuePtr)malloc(sizeof(QNode));

if(!s)

exit(OVERFLOW);

s->data = e;

s->next =NULL;

Q->rear->next =s;//原来对尾的next指向新的元素

Q->rear =s;//将新元素变为对尾

return OK;

}

//队头元素出队

Status DeQueue(LinkQueue *Q,QElemType *e){

QueuePtr p;

if(Q->front == Q->rear)

return ERROR;

p=Q->front->next;//p指向队头元素

*e = p->data;

Q->front->next = p->next;//头结点的后继指向队头的下一个元素

if(Q->rear == p){//队头等于对尾了

Q->rear = Q->front;//对尾指向头结点

}

free(p);

return OK;

}

//遍历元素

Status QueueTraverse(LinkQueue Q){

QueuePtr p;

p=Q.front->next;

while(p){

visit(p->data);

p=p->next;

}

printf("n");

return OK;

}

int main(){

int i;

QElemType d;

LinkQueue q;

i=InitQueue(&q);

//入队10个元素

for(int index=0;index

EnQueue(&q,index);

}

QueueTraverse(q);

DestroyQueue(&q);

printf("队列已经销毁,q.front=%p q.rear=%pn",q.front,q.rear);

return 0;

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读