顺序栈的出栈、入栈、销毁、FIFO以及Makefile【C】

  • 内容
  • 相关

    栈是一种线性结构,有栈顶和栈底,只能对栈顶的进行操作。栈是先进后出的。

一、栈的存储结构

    栈的存储结构有链式存储和顺序存储两种,这里说的是顺序存储。

源代码:

typedef  int datatype;

typedef struct _stack_
{
	datatype  data[N];
	int top;   //用于栈顶指针
}seqstack;

二、入栈

    入栈之前要判断栈是否满了。栈如果满了就不能再进行压栈操作了。

源代码:

int seqstack_push(seqstack *s, datatype  va)
{
	if(seqstack_full(s) == 0)
		return -1;
	s->top++;  //栈顶指针+1
	s->data[s->top] = va;
	return 0;
}

三、出栈

    出栈之前要判断栈是否为空。pop 的时候为防止意外发生,我将栈顶元素传给函数参数*e,让指针把值带回去。

源代码:

int seqstack_pop(seqstack *s,datatype *e)
{
	if(seqstack_empty(s) == 0)   //栈空
		return -1;
	*e = s->data[s->top];   //栈顶元素
	s->top--;    //栈顶指针-1
	return 0;
}

四、像队列一样先进先出

    栈是先进后出的,要用它实现先入先出FIFO,这需要借助另外一个栈完成:首先再创建一个栈p,每次都先判断栈 是否为空,如果为空,就不做转换了,如果不为空,将元素从栈  pop 出来,用一个指针接受栈顶元素,再将这个元素 push p 中,直到 为空为止。

源代码:

seqstack * seqstack_FIFO(seqstack *s)
{
	int i = 0;
	seqstack *p = seqstack_create();
	while(1)
	{
		int ret = seqstack_pop(s,&i);  //i用于接受栈顶元素
		if(ret == -1)  //出栈失败
			break;
		else
			seqstack_push(p, i);
	}
	return p;
}

五、栈的销毁

    malloc 和 free 是成对出现的。顺序栈释放的时候要注意如果栈为空的话释放会产生段错误。

源代码:

void seqstack_destory(seqstack *s)
{
	if(NULL == s)
		return ;
	free(s);
}

戳这 -->seqstack.txt  seqstack (2).txt

        main.txt      Makefile.txt

补充:汉字乱码是因为我是在Linux中写的。。。。。。

完整源代码:

    seqstack.h 文件

#ifndef _SEQSTACK_H_
#define _SEQSTACK_H_

#define N 10
typedef  int datatype;

typedef struct _stack_
{
	datatype  data[N];
	int top;   //用于栈顶指针
}seqstack;
//申请栈空间
seqstack * seqstack_create();
//入栈
int seqstack_push(seqstack *s, datatype  va);
//出栈
int seqstack_pop(seqstack *s,datatype *e);
//获取栈顶元素  *e带回栈顶元素
int seqstack_get_top_value(seqstack *s,datatype *e);
//使用栈技术完成一个先入先出的模型。
seqstack * seqstack_FIFO(seqstack *s);
//栈的销毁
void seqstack_destory(seqstack *s);

#endif 

    seqstack.c文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "seqstack.h"
//申请栈空间
seqstack * seqstack_create()
{
	seqstack *s = (seqstack *)malloc(sizeof(seqstack));
	if(NULL == s)
		return NULL;
	bzero(s,sizeof(seqstack));
	return s;
}
//判空
int seqstack_empty(seqstack *s)
{
	if(s->top == 0)
		return 0;   //栈空
	else
		return -1;
}
//判满
int seqstack_full(seqstack *s)
{
	if(s->top == N)
		return 0;
	else
		return -1;
}
//入栈   要判满
int seqstack_push(seqstack *s, datatype  va)
{
	if(seqstack_full(s) == 0)
		return -1;
	s->top++;
	s->data[s->top] = va;
	return 0;
}
//出栈   要判空  *e带回出栈元素
int seqstack_pop(seqstack *s,datatype *e)
{
	if(seqstack_empty(s) == 0)   //栈空
		return -1;
	*e = s->data[s->top];
	s->top--;
	return 0;
}
//获取栈顶元素  *e带回栈顶元素
int seqstack_get_top_value(seqstack *s,datatype *e)
{
	if(seqstack_empty(s) == 0)   //栈空
		return -1;
	*e = s->data[s->top];
	return 0;
}
//使用栈技术完成一个先入先出的模型。
seqstack * seqstack_FIFO(seqstack *s)
{
	int i = 0;
	seqstack *p = seqstack_create();
	while(1)
	{
		int ret = seqstack_pop(s,&i);
		if(ret == -1)  //出栈失败
			break;
		else
			seqstack_push(p, i);
	}
	return p;
}
//栈的销毁
void seqstack_destory(seqstack *s)
{
	if(NULL == s)
		return ;
	free(s);
}

    main.c文件

#include <stdio.h>
#include <stdlib.h>
#include "seqstack.h"
int main(int argc, char *argv[])
{
	int var = 0,choice = 0,ret = 0,n = 0,i = 0;
	seqstack *s;
	seqstack *p;
	while(1)
	{
		printf("\033c");
		printf("\033[0;31m");
		printf("\t1-申请栈空间\n");
		printf("\t2-入栈\n");
		printf("\t3-出栈\n");
		printf("\t4-获取栈顶元素\n");
		printf("\t5-FIFO\n");
		printf("\t0-退出程序并销毁栈\n");
		printf("Please enter a number as your choice: ");
		scanf("%d",&choice);
		switch(choice)
		{
		case 1:   //申请栈空间
			s = seqstack_create();
			if(NULL == s)
				printf("申请栈空间失败.\n");
			else
				printf("申请栈空间成功.\n");
			break;
		case 2:  //入栈
			printf("请输入数据:");
			scanf("%d",&var);
			ret = seqstack_push(s,var);
			if(ret == -1)
			{
				printf("栈满,入栈失败.\n");
				break;
			}
			else
				printf("入栈成功,入栈的元素是 %d\n",var);
			break;
		case 3:   //出栈
			ret = seqstack_pop(s,&var);
			if(ret == -1)
				printf("栈空,出栈失败.\n");
			else
				printf("出栈成功,出栈的元素是 %d.\n",var);
			break;
		case 4:   //获取栈顶元素
			ret = seqstack_get_top_value(s,&var);
			if(ret == -1)
				printf("栈为空.\n");
			else
				printf("栈顶的元素是: %d\n",var);
			break;
		case 5:   //FIFO
			p = seqstack_FIFO(s);
			while(1)
			{
				ret = seqstack_pop(p,&var);
				if(ret == -1)
				{
					printf("栈空,出栈失败.\n");
					break;
				}
				else
					printf("出栈成功,出栈的元素是 %d\n",var);
			}
			free(p);
			break;
		case 0:  //退出
			seqstack_destory(s);
			break;
		default:
			printf("Input error,please restart enter.\n");
			break;
		}	
		if(choice == 0)
			break;
		printf("\033[5menter continue...");
		getchar();
		while(getchar()!='\n');
	}
	return 0;
}

    Makefile文件

seqstack:seqstack.o main.o
	gcc $^ -o $@ -g
seqstack.o:seqstack.c
	gcc -c $< -o $@ -g
main.o:main.c
	gcc -c $< -o $@ -g
clean:
	rm -rf *.o seqstack

运行效果图:

TIM截图20180202233009.png

本文标签:

版权声明:若无特殊注明,本文皆为《尤尤》原创,转载请保留文章出处。

本文链接:顺序栈的出栈、入栈、销毁、FIFO以及Makefile【C】 - https://www.yxfseo.cn/post-176.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注