堆栈实现
1、用数组实现堆栈
#include <stdio.h> #include <stdlib.h> #define MAXSTACK 100 /*定义堆栈的最大容量*/ int stack[MAXSTACK];/*堆栈的数组说明*/ int top=-1;/*堆栈的顶端*/ /*判断是否为空堆栈*/ int isEmpty() { if(top==-1) return 1; else return 0; } /*将指定的数据压入堆栈*/ int push(int data) { if(top>=MAXSTACK) { printf("堆栈已满,无法再压入\n"); return 0; } else { stack[++top]=data; /*将数据压入堆栈*/ return 1; } } /*从堆栈弹出数据*/ int pop() { if(isEmpty()) /*判断堆栈是否为空,如果是,则返回-1*/ return -1; else return stack[top--]; /*先从堆栈弹出数据,再将堆栈指针往下移*/ } /*主程序*/ int main() { int value; int i; do { printf("To push data into the stack, please enter 1; to pop data from the stack, enter 0; to stop the operation, enter -1.\r\n"); scanf("%d",&i); if(i==-1) break; else if (i==1) { printf("intput number:"); scanf("%d",&value); push(value); } else if(i==0) printf("The data popped from the stack is %d\r\n",pop()); } while(i!=-1); printf("============================\n"); while(!isEmpty()) /*将数据陆续从堆栈顶端弹出*/ printf("The order of data being popped from the stack is %d\r\n",pop()); printf("==========================\n"); system("pause"); return 0; }
2、用链表实现堆栈
#include <stdio.h> #include <stdlib.h> struct Node /*堆栈链表节点的声明*/ { int data; /*堆栈数据的声明*/ struct Node *next;/*堆栈中用来指向下一个节点的指针*/ }; typedef struct Node Stack_Node;/*定义堆栈中节点的新数据类型*/ typedef Stack_Node *Linked_Stack;/*定义链表堆栈的新数据类型*/ Linked_Stack top=NULL;/*指向堆栈顶端的指针*/ int isEmpty(); int pop(); void push(int data); /*判断是否为空堆栈*/ /*主程序*/ int main() { int value; int i; do { printf("要把数据压入堆栈,请输入1,要从堆栈弹出数据则输入0,停止操作则输入-1: "); scanf("%d",&i); if(i==-1) break; else if (i==1) { printf("请输入数据:"); scanf("%d",&value); push(value); } else if(i==0) printf("弹出的数据为%d\n",pop()); } while(i!=-1); printf("============================\n"); while(!isEmpty()) /*将数据陆续从堆栈顶端弹出*/ printf("堆栈弹出数据的顺序为:%d\n",pop()); printf("==========================\n"); system("pause"); return 0; } int isEmpty() { if(top==NULL) return 1; else return 0; } /*将指定的数据压入堆栈*/ void push(int data) { Linked_Stack new_add_node; /*新加入节点的指针*/ /*给新节点分配内存*/ new_add_node=(Linked_Stack)malloc(sizeof(Stack_Node)); new_add_node->data=data;/*将传入的值指定为节点的内容*/ new_add_node->next=top;/*将新节点指向堆栈的顶端*/ top=new_add_node;/*新节点成为堆栈的顶端*/ } /*从堆栈弹出数据*/ int pop() { Linked_Stack ptr; /*指向堆栈顶端的指针*/ int temp; if(isEmpty()) /*判断堆栈是否为空,如果是,则传回-1*/ { printf("===目前为空堆栈===\n"); return -1; } else { ptr=top;/*指向堆栈的顶端*/ top=top->next;/*将堆栈顶端的指针指向下一个节点*/ temp=ptr->data;/*从堆栈弹出的数据*/ free(ptr);/*将节点占用的内存释放*/ return temp;/*将从堆栈弹出的数据返回给主程序*/ } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY