第一周---->数据结构->栈实现队列

实现功能:用两个栈实现队列

        栈:先进后出,只能在栈顶进行操作

        队列:先进先出,只能在队头删除,队尾插入

        程序运行以菜单的形式进行操作

        

入栈:

        键盘输入1进行入栈操作,键盘输入要存储的数据后,将存储的位置进行显示。

        

         一次入栈一个数据,最多可存N个,当栈满后,进行提示,同时无法存储当前输入的数据

        

交换:

        将栈1里的数据倒入栈2

        例如:

        

         如果栈1内有数据则交换成功,如果没有则交换失败

        

出栈:

       将栈2中数据输出,一次输出一个,同时显示当前输出数据存储的位置。若栈空,则进行提示

        

使用Makefile实现指定文件夹中多文件的编译,程序代码如下:

头文件.h 

#ifndef _STACK_QUEUE_H
#define _STACK_QUEUE_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5
//定义元素的数据类型
typedef int data_type;
//定义两个顺序栈的数据类型
typedef struct stack
{
	data_type arr[N];
	int top;
}Stack;

enum res
{
	STACKNULL=-5,
	STACK_1_NULL,
	STACK_2_NULL,
	EMPTY,
	FULL,
	OK,
};

//创建顺序栈
//参数:void
//返回值:成功返回栈的首地址,失败返回NULL
Stack* createStack(void);

//入栈
//参数1:栈的首地址 Stack1 *pStack1
//参数2:要插入的数据
//返回值 成功返回OK 失败返回失败原因
int EnStack(Stack *pStack1,data_type item);

//出栈
//参数1 第一个栈(入栈)的首地址
//参数2 第二个栈(出栈)的首地址
//参数3 保存要出栈的数据 data_type *pData
//返回值 成功返回OK 失败返回失败原因
int OutStack(Stack *pStack2,data_type *pData);

//交换
//将 栈1 的数据放入 栈2
int ChangeStack(Stack *pStack,Stack *pStack2);

#endif

 函数.c 

#include "../include/stack_queue.h"

//创建第一个顺序栈
Stack *createStack(void)
{
	Stack *pStack = NULL;
	pStack = (Stack *)malloc(sizeof(Stack));
	if(NULL == pStack)
	{
		perror("malloc error");
		return NULL;
	}
	memset(pStack,0,sizeof(Stack));
	pStack->top = -1;

	return pStack;
}

//入栈
int EnStack(Stack *pStack1,data_type item)
{
	//入参判断
	if(NULL == pStack1)
		return STACKNULL;
	//判断是否栈满
	if(pStack1->top == N-1)
		return FULL;
	//下标+1
	pStack1->top++;
	//将新值入栈
	pStack1->arr[pStack1->top] = item;

	return OK;
}

//交换顺序
int ChangeStack(Stack *pStack1,Stack *pStack2)
{
    if(-1 == pStack1->top)
    {
        printf("栈1内无数据,交换失败!\n");
	    pStack2->top++;
    }
    pStack2->top = 0;
	while(pStack1->top != -1)
	{
//		printf("+++++++\n");
		pStack2->arr[pStack2->top] = pStack1->arr[pStack1->top];
		pStack1->top--;
		pStack2->top++;
	}
    printf("交换完成!\n");
//	printf("pStack2->top = %d\n",pStack2->top);
	return OK;
}

//出栈
int OutStack(Stack *pStack2,data_type *pData)
{
	//入参判断
	if(NULL == pStack2)
		return STACK_2_NULL;
	//判断是否栈空
	if(pStack2->top == 0)
		return EMPTY;
	//交换顺序 一栈数据放入二栈		
	//保存要出栈的数据
	pStack2->top--;
	*pData = pStack2->arr[pStack2->top];

	return OK;
}

主函数.c

#include "../include/stack_queue.h"

int main(int argc, const char *argv[])
{
	data_type item = 0;
	Stack *pStack1 = createStack();
	Stack *pStack2 = createStack();
	int op =0;

	//入栈
	while(1)
	{
		printf("***********************************\n");
		printf("| 菜 | * 1-------------------入队 *\n");
		printf("|    | * 2-------------------交换 *\n");
		printf("|    | * 3-------------------出队 *\n");
		printf("| 单 | * 0-------------------退出 *\n");
		printf("***********************************\n");
		printf("请输入选项:------->  ");
		scanf("%d",&op);
		if(0 == op)
			break;
		switch(op)
		{
			case 1:
				printf("请输入要入栈的数据:\n");
				scanf("%d",&item);
				if(EnStack(pStack1,item) != OK)
				{
					printf("当前栈满,无法存入!\n");
					break;
				}
				printf("数据存到top = %d\n",pStack1->top);
				break;
			case 2:
				ChangeStack(pStack1,pStack2);
				break;
			case 3:	
				//出栈
				if(OutStack(pStack2,&item) == EMPTY)		
				{
					printf("当前无数据!\n");
					break;
				}
				printf("top = %d\n",pStack2->top);
				printf("%d\n",item);		
				printf("\n");
				break;
		}
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值