实现功能:用两个栈实现队列
栈:先进后出,只能在栈顶进行操作
队列:先进先出,只能在队头删除,队尾插入
程序运行以菜单的形式进行操作
入栈:
键盘输入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;
}