欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

数据结构——栈与队列操作(用栈模拟队列)

发布时间:2025/7/25 66 豆豆
生活随笔 收集整理的这篇文章主要介绍了 数据结构——栈与队列操作(用栈模拟队列) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

【栈与队列操作】
问题描述:假设有两个长度相同的栈 S1,S2,已知以下入栈、出栈、判栈满和判栈空操作:
void Push(S,x);
Elemtype Pop(S);
bool StackFull(S);
bool StackEmpty(S);
现用这两个栈构成一个队列,实现入队列、出队列操作的算法:
bool EnQueue(x);
Elemtype DeQueue(S);

要求:
(1)设栈空间大小MaxSize=10,队列的数据通过调用算法initRandomize(int *arr, int n, int min, int max)随机产生。
(2)测试环节要包含出队列"空"和入队列"满"的情况出现。

知识点:
1.静态栈的基本算法(因为简单,自定义函数短小,总觉得遗漏了些什么)
2.用栈来模拟队列(这里就没定义队列了,栈S1就当作时队列了,出队列的时候借用栈S2来倒序输出)
3.关于initRandomize(int *arr, int n, int min, int max)的使用
4.还有就是Sleep()、memset()的使用

自己基于【数据结构】【严蔚敏】版敲的
(网上应该会有许多更优的思路)
直接来完整代码:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define TRUE 1 #define FALSE 0 #define MAXSIZE 10 //栈的大小和队列的大小都是 10 typedef int Elemtype; typedef struct Stack {int data[MAXSIZE]; int top; // 栈顶指针 } SqStack;#include <time.h> //time(0)需要的头文件 (代表当前时间自标准时间戳(1970年1月1日0点0分0秒,GMT)经过了多少秒) void initRandomize(int *arr, int n, int min, int max) {int i = 0;srand(time(0)); /*设置种子,并生成伪随机序列*/for (i = 0; i < n; ++i) {arr[i] = rand()% (max - min + 1) + min; /*得到从[min, max]之间的随机数*/printf("%d ", arr[i]);}printf("\n");}int InitStack(SqStack &S) //初始化静态栈 {S.top=0; }int Push(SqStack &S,int e) {if(S.top>=MAXSIZE) return ERROR;S.data[S.top++]=e;return OK; }int Pop(SqStack &S,int &e) {if(S.top == 0) return ERROR;e=S.data[--S.top];//e=*(S.data+S.top-1)return OK; }int Empty(SqStack &S) {if(S.top == 0) return 1;else return 0;} int Full(SqStack S) {if(S.top == MAXSIZE) return 1;else return 0; }SqStack S1; SqStack S2; int EnQueue(int x)//进入队列 {if(Full(S1)){printf("队列已满\n");}elsePush(S1,x);} Elemtype DeQueue()//出队列 {if(Empty(S1)){printf("队列为空\n");}InitStack(S2);int e;while(!Empty(S1)){Pop(S1,e);Push(S2,e); }while(!Empty(S2)){Pop(S2,e);printf("%d ",e);}printf("\n\n\n");}int EmptyStack(SqStack &S) //判断栈是否为空 {if(Empty(S1)) return 1;else 0; }void test1() {int a[10],i; initRandomize(&a[0], 10, 1, 1002);//生成15个随机数 InitStack(S1); for(i=0;i<10;i++) //溢出与不溢出关键看这里读入了几个数,栈的大小等于队列的大小 {EnQueue(a[i]);}printf("输出队列为:\n"); DeQueue();//memset(a,0,sizeof(int)*10); }void test2() {int a[10]={1,2,3},i; initRandomize(&a[3], 10, 1, 1002); InitStack(S1); for(i=0;i<11;i++) //溢出与不溢出关键看这里读入了几个数,栈的大小=队列的大小=MAXSIZE=10 {EnQueue(a[i]);}if(i<=10){printf("输出队列为:\n"); DeQueue();}//memset(a,0,sizeof(int)*10);//printf("%d %d",a[0],*(a+3)); }void test3() {int a[10],i; initRandomize(&a[0], 10, 1, 1002); InitStack(S1); for(i=0;i<0;i++) //溢出与不溢出关键看这里读入了几个数,栈的大小等于队列的大小 {EnQueue(a[i]); }if(!Empty(S1)){printf("输出队列为:\n"); DeQueue();}elseprintf("队列为空"); }int main() {test1(); //正常情况 Sleep(1000);//暂停1秒,变化种子点 test2(); // 溢出 test3(); // 为空 }

转载于:https://www.cnblogs.com/vivid-victory/p/10090473.html

总结

以上是生活随笔为你收集整理的数据结构——栈与队列操作(用栈模拟队列)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。