数据结构栈和队列的简单操作

mac2024-10-09  53

一、静态栈

#include <stdio.h> #include <stdlib.h> #define P 5 //定义最大栈容量 typedef struct Stack //定义栈 { int data[P]; //栈中的数据 int top; //栈顶 }stack; stack Init()//初始化栈 { stack s; s.top = -1; return s; } int Push(stack &s,int n) //进栈操作 &s是将s变量的地址压入栈中,最终压栈的操作都是通过地址操作(即指针)来完成 { if(s.top == P-1) //进栈的时候必须判断是否栈满 { printf("stack full\n"); } s.top++; s.data[s.top] = n; if(s.top == P-1) //进栈结束的时候判断是否栈满 { return 0; } return 1; } int Pop(stack &s) //出栈操作 { int n; if(s.top == -1) //出栈的时候必须判断是否栈空 { printf("stack empty\n"); return 0; } n = s.data[s.top]; s.top--; return n; } int main() { int n,i=1; stack s; //定义结构体变量s s = Init(); //初始化栈 printf("请输入进栈的元素:\n"); while(i) { scanf("%d",&n); i = Push(s,n); } printf("出栈的结果:"); while(s.top != -1) { printf("%d ",Pop(s)); } printf("\n"); system ("pause"); return 0; }

二、动态栈

#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct Node //定义一个链表式结点结构体 { int date; struct Node *next; }*node; typedef struct Stack //定义链式栈结构体 { node top; //栈顶指针 int count; //记录栈结点数量 }stack; void push(stack *S) { int m,i; int n; //入栈元素 printf("请输入你需要入栈数据的个数: "); scanf("%d",&m); for(i=0;i<m;i++) { printf("你输入的第%d个数据为 :",i+1); scanf("%d",&n); //输入数据 node s = (node)malloc(sizeof(struct Node)); s -> date = n; s -> next = S->top; S -> top = s; S -> count ++; } } void pop(stack *S) { node s; //定义一个结点指针变量 if(S->count == 0) //判断栈是否为空(必须有这一步) { printf("栈空\n"); exit(0); } printf("出栈结果为: "); while(S->count != 0) { s = S->top; //让新定义的结点指针指向当前栈顶 printf("%d ",s->date); //输出结点数据 S->top=s->next; //让栈顶指针指向栈顶结点的下一个结点 free(s); //释放掉结点s S->count--; //结点个数减一 } printf("\n\n"); } //取栈顶元素 void Gettop(stack *S) { if(S->count == 0) //判断栈是否为空 { printf("栈空\n"); exit(0); } printf("栈顶元素为: "); printf("%d ",S->top->date); //输出结点数据 printf("\n\n"); } int main() { int i; stack S; S.count = 0; while(1) //无限循环 { printf("请选择下列操作\n"); printf("1:进栈操作\n"); printf("2:出栈操作\n"); printf("3:取栈顶元素\n"); printf("4:退出\n"); scanf("%d",&i); switch(i) { case 1:push(&S); break; //进栈操作 case 2:pop(&S); break; //出栈操作 case 3:Gettop(&S);break; //取栈顶元素 case 4:exit(0); //退出程序 default: printf("输入错误,请重新输入!!!\n"); break; } } printf("\n"); system ("pause"); return 0; }

三、队列

#include <stdio.h> #include <stdlib.h> #define maxsize 5 //队结点 typedef struct Node { int data; struct Node *next; }Node,*DNode; //指针队列 typedef struct Queue { DNode front; DNode rear; //==Node *front,*rear }Queue,*DQueue; //初始化 void initQueue(DQueue Q) { Q=(DQueue)malloc(sizeof(Queue)); Q->front=Q->rear=NULL; } //判断队为空 //入队 void inQueue(DQueue Q,int x) { //理论上不存在队满,除非内存满了,所以不用判断队满 //申请队结点 DNode q; q=(DNode)malloc(sizeof(Node)); q->next=NULL; q->data=x; //如果队空,则插入结点为队首结点 if(Q->rear==NULL) Q->front=Q->rear=q; else { //y队不为空,尾指针所指的结点的next连接上q,同时后移尾指针 Q->rear->next=q; Q->rear=q; } } //出队 int outQueue(DQueue Q,int x) { //队空不能出队,两个结点都不为空即可。就是有一个结点为空即队空 if(Q->front==NULL || Q->rear==NULL) return -1; DNode q; //出队结点一定是front指向的结点,用一个结点q存储和释放出队结点 q=Q->front; //判断是否仅有一个结点,仅有一个结点与多个结点处理起来不同 if(Q->front==Q->rear) Q->front=Q->rear=NULL; else Q->front=Q->front->next; x=q->data; free(q); return x; } int main() { DQueue Q; int x; initQueue(Q); inQueue(Q, 11); inQueue(Q, 4); inQueue(Q, 7); inQueue(Q, 9); x=outQueue(Q, x); printf("%d\n",x); x=outQueue(Q, x); printf("%d\n",x); x=outQueue(Q, x); printf("%d\n",x); x=outQueue(Q, x); printf("%d\n",x); //队空出队测试 x=outQueue(Q, x); printf("%d\n",x); return 0; }

代码结果为:

最新回复(0)