栈与队列基本操作的编程实现
栈和队列基本操作的编程实现,掌握栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,也可以进一步编程实现实用的功能等操作,具体编程存储结构要求是顺序存储结构和链表存储结构,可以依次完成主要功能来体现功能的正确性,用菜单进行管理完成大部分功能,要求可以重复运行。白底黑字,标题栏为自己的个人信息。
对于顺序栈,我采用的是数组的方法。首先定义了一个一维数组dataarray[30],为了存储数据。还定义了一个栈顶top,初始化top=-1。
void push()
{
if(datanumber<=0||datanumber==top+1) //判断栈的空间大小
printf("入栈失败!\n");
else
{
printf("向栈压入数据为:");
top++; //栈顶先向后移动
scanf("%d",&dataarray[top]); //再输入数据
printf("目前栈的内容是:栈底 ->");
for(int i=0;i<=top;i++)
{
printf("【%d】 ",dataarray[i]); //显示栈
}
printf("<-栈顶\n");
}
}
void pop()
{
if(datanumber<=0||top==-1) //判断栈的空间大小
printf("出栈失败!\n");
else
{
printf("从栈中弹出数据:%d\n",dataarray[top]); //显示栈顶数据
top--; //栈顶前移
if(top==-1)
printf("目前是空栈!\n");
else
{
printf("目前栈的内容是:栈底-> ");
for(int i=0;i<=top;i++)
{
printf("【%d】 ",dataarray[i]); //显示栈
}
printf("<-栈顶\n");
}
}
}
//首先定义结构体,链表头结点
struct link //定义链表结构体
{
int data;
struct link *next;
};
struct link linktop;//头结点,栈顶
struct link *newp;//新空间
struct link *lastp;//栈底
int datanumber=0;//记录栈空间
void push()
{
printf("输入准备进栈的数据:");
newp=(struct link *)malloc(sizeof(struct link)); //申请新空间
scanf("%d",&newp->data); //输入新数据
datanumber++; //计数器加1
//挂链操作
newp->next=linktop.next; //新结点指向第一个结点
linktop.next=newp; //头结点指向新结点
printf("进栈操作成功!\n");
}
void pop()
{
if(datanumber==0)
printf("没有找到栈或者栈为空!\n"); //判断栈的空间大小
else
{
struct link *searchp;
searchp=linktop.next; //searchp指向第一个结点
printf("从栈中弹出数据:%d\n",searchp->data);
linktop.next=searchp->next; //挂链
free(searchp); //释放结点
datanumber--; //计数器减1
}
}
//定义环队数组、队头队尾
int dataarray[10];//定义存储数组
int datanumber=0;//空间大小
int front=0;//队头
int rear=0;//队尾
void push()
{
if(datanumber>=10) //判断队空间
printf("环队已满!\n");
else
{
printf("请输入要进队的新数据:");
scanf("%d",&dataarray[rear]); //进队
rear=(rear+1)%10; //rear前移一位
datanumber++; //计数器加1
printf("进队操作成功!\n");
}
}
void pop()
{
if(datanumber<=0) //判断队空间
printf("环队为空!\n");
else
{
printf("出队数据为:%d\n",dataarray[front]); //出队
front=(front+1)%10; //front前移一位
datanumber--; //计数器减1
printf("出队操作成功!\n");
}
}
struct link
{
int data;
struct link *next;
};
struct link front; //队头(头结点)
struct link *newp; //新结点
struct link *rear; //队尾
(1)数据进队、出队源码过程
void push()
{
if(count==0) //判断队是否为空
{
front.next=NULL;
rear=&front;
}
printf("请输入要进队的新数据:");
newp=(struct link *)malloc(sizeof(struct link)); //申请新空间
count++; //计数器加1
scanf("%d",&newp->data); //输入数据
//挂链
rear->next=newp;
newp->next=NULL;
rear=newp;
printf("进队操作成功!\n");
}
void pop()
{
if(count==0) //判断队是否为空
printf("目前链队为空!\n");
else
{
struct link *searchp;
searchp=front.next; //searchp为第一个结点
printf("出队数据为:%d\n",searchp->data);
front.next=searchp->next; //头结点指向第二个结点
count--; //计数器减1
free(searchp); //释放结点
printf("出队操作成功!\n");
}
}
#include
#include
#include
void showmenu();//菜单显示
void processmenu();//菜单控制
void push();//数据进栈
void pop();//数据出栈
void showdata();//显示栈中全部数据
void readdata();//读取栈顶数据
void destroy();//销毁一个栈
void isempty();//判断是否空栈
struct link { //定义链表结构体
int data;
struct link *next;
};
struct link linktop;//头结点,栈顶
struct link *newp;//新空间
struct link *lastp;//栈底
int datanumber=0;//记录栈空间
int count=0;
int main() {
system("color f0");//背景白色
while(1) {
showmenu();
processmenu();
system("pause");
system("cls");
}
}
void showmenu() {
puts("~~~~~~~~~~~~~~~~~~~~~~~~");
puts("\t\t链栈的功能演示");
puts("\t\t操作软件:dev c++");
puts(" ~~~~~~~~~~~~~~~~~~~~~~~~");
puts("~~~\t\t1、数据进栈\t\t~~~~");
puts(" ~~~\t\t2、数据出栈\t\t ~~~~");
puts("~~~\t\t3、显示栈中全部数据\t~~~~");
puts(" ~~~\t\t4、读取栈顶数据\t\t ~~~~");
puts("~~~\t\t5、销毁一个栈\t\t~~~~");
puts(" ~~~\t\t6、判断是否空栈\t\t ~~~~");
puts("~~~\t\t0、退出程序\t\t~~~~");
puts("~~~~~~~~~~~~~~~~~~~~~~~~");
puts("");
printf("请输入您的选择:");
}
void processmenu() {
int menuchoice;//菜单选择
scanf("%d",&menuchoice);
switch(menuchoice) {
case 1:
push();//数据进栈
break;
case 2:
pop();//数据出栈
break;
case 3:
showdata();//显示栈中全部数据
break;
case 4:
readdata();//读取栈顶数据
break;
case 5:
destroy();//销毁一个栈
break;
case 6:
isempty();//判断是否空栈
break;
case 0:
puts("\n ~~~~~~~~~~~~~~~~~~~~~~~~");
puts("\t\t欢迎下次再用!");
puts(" ~~~~~~~~~~~~~~~~~~~~~~~~\n");
exit(0);
default :
printf("输入错误!请重新输入...\n");
}
}
void push() {
printf("输入准备进栈的数据:");
newp=(struct link *)malloc(sizeof(struct link));
scanf("%d",&newp->data);
count++;
datanumber++;
newp->next=linktop.next;
linktop.next=newp;
printf("进栈操作成功!\n");
}
void showdata() {
if(datanumber==0)
printf("没有找到栈或者栈为空!\n");
else {
count=datanumber;
struct link *searchp;
searchp=&linktop;
printf("目前栈的内容是:栈顶-> ");
while(count>0) {
printf("【%d】",searchp->next->data);
searchp=searchp->next;
count--;
}
printf("<-栈底\n");
}
}
void pop() {
if(datanumber==0)
printf("没有找到栈或者栈为空!\n");
else {
struct link *searchp;
searchp=linktop.next;
printf("从栈中弹出数据:%d\n",searchp->data);
linktop.next=searchp->next;
free(searchp);
datanumber--;
}
}
void readdata() {
if(datanumber<=0)
printf("没有找到栈或者栈为空!\n");
else
printf("栈顶的数据为:%d\n",linktop.next->data);
}
void destroy() {
struct link *searchp;
char choice;
if(datanumber==0)
printf("没有找到栈或者栈为空!\n");
else {
printf("是否确认销毁(Y/y),任意为放弃:");
getchar();
scanf("%c",&choice);
if(choice=='y'||choice=='Y') {
printf("销毁成功!\n");
datanumber=0;
searchp=linktop.next;
for(int i=0; i<datanumber; i++) {
free(searchp);
searchp=searchp->next;
}
} else {
printf("销毁失败!\n");
}
}
}
void isempty() {
if(datanumber==0)
printf("栈为空!\n");
else
printf("栈为非空!\n");
}
#include
#include
#include
#define len 30
void showmenu();//菜单显示
void processmenu();//菜单控制
void create();//创建一个栈
void destroy();//销毁一个栈
void push();//数据进栈
void pop();//数据出栈
void showdata();//显示栈中全部数据
void readdata();//读取栈顶数据
void isempty();//判断是否空栈
void isfull();//判断是否满栈
int dataarray[len];//定义存储数组
int datanumber=0;//栈的空间大小
int top=-1;//空栈
int main() {
system("color f0");//背景白色
while(1) {
showmenu();
processmenu();
system("pause");
system("cls");
}
}
void showmenu() {
puts("~~~~~~~~~~~~~~~~~~~~~~~~");
puts("\t\t顺序栈的功能演示");
puts("\t\t操作软件:dev c++");
puts(" ~~~~~~~~~~~~~~~~~~~~~~~~");
puts("~~~\t\t1、创建一个栈\t\t~~~~");
puts(" ~~~\t\t2、销毁一个栈\t\t ~~~~");
puts("~~~\t\t3、数据进栈\t\t~~~~");
puts(" ~~~\t\t4、数据出栈\t\t ~~~~");
puts("~~~\t\t5、显示栈中全部数据\t~~~~");
puts(" ~~~\t\t6、读取栈顶数据\t\t ~~~~");
puts(" ~~~\t\t7、判断是否空栈\t\t ~~~~");
puts(" ~~~\t\t8、判断是否满栈\t\t ~~~~");
puts("~~~\t\t0、退出程序\t\t~~~~");
puts("~~~~~~~~~~~~~~~~~~~~~~~~");
puts("");
printf("请输入您的选择:");
}
void processmenu() {
int menuchoice;//菜单选择
scanf("%d",&menuchoice);
switch(menuchoice) {
case 1:
create();//创建一个栈
break;
case 2:
destroy();//销毁一个栈
break;
case 3:
push();//数据进栈
break;
case 4:
pop();//数据出栈
break;
case 5:
showdata();//显示栈中全部数据
break;
case 6:
readdata();//读取栈顶数据
break;
case 7:
isempty();//判断是否空栈
break;
case 8:
isfull();//判断是否满栈
break;
case 0:
puts("\n ~~~~~~~~~~~~~~~~~~~~~~~~");
puts("\t\t欢迎下次再用!");
puts(" ~~~~~~~~~~~~~~~~~~~~~~~~\n");
exit(0);
default :
printf("输入错误!请重新输入...\n");
}
}
void create() {
if(datanumber!=0)
printf("栈已经存在,空间大小为:%d\n",datanumber);
else {
datanumber==0;
top==-1;
printf("请输入栈的空间大小(30以内):");
scanf("%d",&datanumber);
printf("创建栈成功!\n");
}
}
void destroy() {
char choice;
if(datanumber<=0)
printf("没有找到栈!\n");
else {
printf("是否确认销毁(Y/y),任意为放弃:");
getchar();
scanf("%c",&choice);
if(choice=='y'||choice=='Y') {
printf("销毁成功!\n");
datanumber=0;
top=-1;
} else {
printf("销毁失败!\n");
}
}
}
void push() {
if(datanumber<=0||datanumber==top+1)
printf("入栈失败!\n");
else {
printf("向栈压入数据为:");
top++;
scanf("%d",&dataarray[top]);
printf("目前栈的内容是:栈底 ->");
for(int i=0; i<=top; i++) {
printf("【%d】 ",dataarray[i]);
}
printf("<-栈顶\n");
}
}
void pop() {
if(datanumber<=0||top==-1)
printf("出栈失败!\n");
else {
printf("从栈中弹出数据:%d\n",dataarray[top]);
top--;
if(top==-1)
printf("目前是空栈!\n");
else {
printf("目前栈的内容是:栈底-> ");
for(int i=0; i<=top; i++) {
printf("【%d】 ",dataarray[i]);
}
printf("<-栈顶\n");
}
}
}
void showdata() {
if(datanumber<=0||top==-1)
printf("没有建立栈或为空栈!\n");
else {
printf("目前栈的内容是:栈底 ->");
for(int i=0; i<=top; i++) {
printf("【%d】 ",dataarray[i]);
}
printf("<-栈顶\n");
}
}
void readdata() {
if(datanumber<=0||top==-1)
printf("没有建立栈或为空栈!\n");
else {
printf("目前栈顶的内容是:%d \n",dataarray[top]);
printf("目前栈的内容是:栈底-> ");
for(int i=0; i<=top; i++) {
printf("【%d】 ",dataarray[i]);
}
printf("<-栈顶\n");
}
}
void isempty() {
if(top==-1)
printf("目前是空栈!\n");
else
printf("目前是非空栈!\n");
}
void isfull() {
if(datanumber==0)
printf("栈没有建立!\n");
else if(top+1<datanumber)
printf("目前非满栈,可继续入栈!\n");
else
printf("目前满栈,无法再入栈!\n");
}
#include
#include
#include
void showmenu();//菜单显示
void processmenu();//菜单控制
void push();//数据进队
void pop();//数据出队
void showdata();//遍历数据
void readlong();//读取长度
void readfront();//读取队头
void isempty();//判断队空
int count=0;//计数
struct link
{
int data;
struct link *next;
};
struct link front;//头
struct link *newp;//新
struct link *rear;//尾
int main()
{
system("color f0");//背景白色
while(1)
{
showmenu();
processmenu();
system("pause");
system("cls");
}
}
void showmenu()
{
puts("~~~~~~~~~~~~~~~~~~~~~~~~");
puts("\t\t链队的功能演示");
puts("\t\t操作软件:dev c++");
puts(" ~~~~~~~~~~~~~~~~~~~~~~~~");
puts("~~~\t\t1、数据进队\t\t~~~~");
puts(" ~~~\t\t2、数据出队\t\t ~~~~");
puts("~~~\t\t3、遍历数据\t\t~~~~");
puts(" ~~~\t\t4、读取队头\t\t ~~~~");
puts("~~~\t\t5、判断队空\t\t~~~~");
puts(" ~~~\t\t6、求链队长度\t\t ~~~~");
puts("~~~\t\t0、退出程序\t\t~~~~");
puts("~~~~~~~~~~~~~~~~~~~~~~~~");
puts("");
printf("请输入您的选择:");
}
void processmenu()
{
int menuchoice;//菜单选择
scanf("%d",&menuchoice);
switch(menuchoice)
{
case 1:
push();//数据进队
break;
case 2:
pop();//数据出队
break;
case 3:
showdata();//遍历数据
break;
case 4:
readfront();//读取队头
break;
case 5:
isempty();//判断队空
break;
case 6:
readlong();//读取长度
break;
case 0:
puts("\n ~~~~~~~~~~~~~~~~~~~~~~~~");
puts("\t\t欢迎下次再用!");
puts(" ~~~~~~~~~~~~~~~~~~~~~~~~\n");
exit(0);
default :
printf("输入错误!请重新输入...\n");
}
}
void push()
{
if(count==0)
{
front.next=NULL;
rear=&front;
}
printf("请输入要进队的新数据:");
newp=(struct link *)malloc(sizeof(struct link));
count++;
scanf("%d",&newp->data);
rear->next=newp;
newp->next=NULL;
rear=newp;
printf("进队操作成功!\n");
}
void showdata()
{
if(count==0)
printf("目前链队为空!\n");
else
{
struct link *searchp;
printf("链队中全部数据为:");
searchp=front.next;
printf("front->(");
while(searchp!=NULL)
{
printf(" %d",searchp->data);
searchp=searchp->next;
}
printf(")<-rear\n");
printf("显示操作成功!\n");
}
}
void pop()
{
if(count==0)
printf("目前链队为空!\n");
else
{
struct link *searchp;
searchp=front.next;
printf("出队数据为:%d\n",searchp->data);
front.next=searchp->next;
count--;
free(searchp);
printf("出队操作成功!\n");
}
}
void readfront()
{
if(count==0)
printf("目前链队为空!\n");
else
{
printf("队头的数据为:%d\n",front.next->data);
printf("读取操作成功!\n");
}
}
void isempty()
{
if(count==0)
printf("目前链队为空!\n");
else
printf("目前链队为非空!\n");
}
void readlong()
{
printf("目前链队的长度为:%d\n",count);
}
#include
#include
#include
void showmenu();//菜单显示
void processmenu();//菜单控制
void push();//数据进队
void pop();//数据出队
void showdata();//遍历数据
void readlong();//读取长度
void readfront();//读取队头
void isempty();//判断队空
int dataarray[10];//定义存储数组
int datanumber=0;//空间大小
int front=0;//队头
int rear=0;//队尾
int main()
{
system("color f0");//背景白色
while(1)
{
showmenu();
processmenu();
system("pause");
system("cls");
}
}
void showmenu()
{
puts("~~~~~~~~~~~~~~~~~~~~~~~~");
puts("\t\t环队的功能演示");
puts("\t\t操作软件:dev c++");
puts(" ~~~~~~~~~~~~~~~~~~~~~~~~");
puts("~~~\t\t1、数据进队\t\t~~~~");
puts(" ~~~\t\t2、数据出队\t\t ~~~~");
puts("~~~\t\t3、遍历数据\t\t~~~~");
puts(" ~~~\t\t4、读取队头\t\t ~~~~");
puts("~~~\t\t5、判断队空\t\t~~~~");
puts(" ~~~\t\t6、求链队长度\t\t ~~~~");
puts("~~~\t\t0、退出程序\t\t~~~~");
puts("~~~~~~~~~~~~~~~~~~~~~~~~");
puts("");
printf("请输入您的选择:");
}
void processmenu()
{
int menuchoice;//菜单选择
scanf("%d",&menuchoice);
switch(menuchoice)
{
case 1:
push();//数据进队
break;
case 2:
pop();//数据出队
break;
case 3:
showdata();//遍历数据
break;
case 4:
readfront();//读取队头
break;
case 5:
isempty();//判断队空
break;
case 6:
readlong();//读取长度
break;
case 0:
puts("\n ~~~~~~~~~~~~~~~~~~~~~~~~");
puts("\t\t欢迎下次再用!");
puts(" ~~~~~~~~~~~~~~~~~~~~~~~~\n");
exit(0);
default :
printf("输入错误!请重新输入...\n");
}
}
void push()
{
if(datanumber>=10)
printf("环队已满!\n");
else
{
printf("请输入要进队的新数据:");
scanf("%d",&dataarray[rear]);
rear=(rear+1)%10;
datanumber++;
printf("进队操作成功!\n");
// printf("目前front=%d,rear=%d,count=%d\n",front,rear,datanumber);
}
}
void pop()
{
if(datanumber==0)
printf("环队为空!\n");
else
{
printf("出队数据为:%d\n",dataarray[front]);
front=(front+1)%10;
datanumber--;
printf("出队操作成功!\n");
// printf("目前front=%d,rear=%d,count=%d\n",front,rear,datanumber);
}
}
void showdata()
{
printf("环队中全部数据为:front->(");
for(int i=front;i<datanumber+front;i++)
{
printf(" %d",dataarray[i%10]);
}
printf(")<-rear\n");
printf("遍历操作成功!\n");
}
void readfront()
{
printf("队头的数据为:%d\n",dataarray[front]);
printf("读取操作成功!\n");
}
void readlong()
{
printf("环队目前的长度为:%d\n",datanumber);
}
void isempty()
{
if(datanumber==0)
printf("目前环队为空!\n");
else
printf("目前环队非空!\n");
}