利用栈结构完成队列元素逆置
1,将1-9入队列
2,出队列
3,进栈
4,出栈
#include<stdio.h>
#include<stdlib.h>
#include "stack.h";
#define Capacity 9
typedef struct Node {
int data;
struct Node* next;
}node;
//定义一个链队列
typedef struct LinkQueue {
node* front; //队首结点
node* rear; //队尾结点
}LQ;
//初始化空链队列
LQ initLQ(LQ LQ) {
LQ.front = (node*)malloc(sizeof(node));
LQ.front->data = -1;
LQ.front->next = NULL;
LQ.rear = LQ.front; //队首结点和队尾结点是同一个结点
return LQ;
}
//遍历打印出栈中的全部元素
void showStack(node* LS) {
printf("链栈中的元素是:\n");
node* tmp;
for (tmp = LS; tmp != NULL; tmp = tmp->next) { //遍历时,注意tmp!=NULL,不是 tmp->next!=NULL,前者可以遍历到栈底结点,后者栈底结点遍历不到
printf("%d ", tmp->data);
}
printf("\n");
}
//进栈
node* PushStack(node* LS ,int elem) { //LS是栈顶结点
node* new_node = (node*)malloc(sizeof(node)); //创建一个结点
if (new_node == NULL) {
printf("创建链栈结点失败\n");
exit(0);
}
else {
new_node->data = elem;
new_node->next = LS; //给新结点的指针域赋值,新结点指向当前栈顶结点
LS = new_node; //新结点成为新的栈顶结点
//printf("将%d压入链栈后,栈顶元素是:%d\n", i, LS2->data);
}
return LS;
}
//出栈
void PopStack(node* LS) {
while (LS != NULL) {
node* tmp = LS;
LS = tmp->next;
printf("出栈元素是:%d\n", tmp->data);
free(tmp);
printf("栈顶元素是:%d\n", LS->data);
}
}
//入队列
LQ pushQueue(LQ LQ) {
for (int i = 1; i < 10; i++) {
node* new_node = (node*)malloc(sizeof(node));//生成新结点
new_node->data = i;
new_node->next = NULL;
LQ.rear->next = new_node; //在队尾结点处插入新结点
LQ.rear = new_node;//队尾结点后移
}
return LQ;
}
//出队列
node* popQueue(LQ LQ,node* LS) {
while (LQ.front != LQ.rear) {
printf("出队结点是:%d\n", LQ.front->next->data); //从入队第一个元素开始打印
LS = PushStack(LS, LQ.front->next->data); //出队元素进栈
showStack(LS);
//PopStack(LS);
node* tmp = LQ.front;
LQ.front = LQ.front->next;
free(tmp);
}
free(LQ.front);
return LS;
}
//打印队列全部元素
void showLQ(LQ LQ) {
node* tmp = LQ.front;
while (tmp != NULL) {
printf("%d ", tmp->data);
tmp = tmp->next;
}
printf("\n");
}
void main() {
struct LinkQueue myLQ;
node* mystack = NULL;
myLQ.front = myLQ.rear = NULL;
myLQ = initLQ(myLQ);
printf("初始化空队列是:\n");
printf("%d\n", myLQ.front->data);
printf("队首结点是:%d\n", myLQ.front->data);
printf("队尾结点是:%d\n", myLQ.rear->data);
myLQ = pushQueue(myLQ);
printf("将1-9个元素入队后的队列是:\n");
showLQ(myLQ);
printf("队首结点是:%d\n", myLQ.front->data);
printf("队尾结点是:%d\n", myLQ.rear->data);
printf("链队列元素开始出队:\n");
mystack=popQueue(myLQ,mystack);
printf("队列元素出队列后,进栈,再出栈:\n");
PopStack(mystack);
}


浙公网安备 33010602011771号