自主编程实现栈和链式栈
来源:互联网 发布:xbox360手柄驱动mac版 编辑:程序博客网 时间:2024/05/29 07:10
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端
被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元
素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素
成为新的栈顶元素。
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数
据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个
读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
下面是普通栈的操作代码:
#include <stdio.h>#define STACK_SIZE 100#define OK 0#define ERROR -1typedef int dataType ;typedef struct{dataType data[STACK_SIZE] ; //栈数组int top ; //栈顶下表}SeqStack ;//置空栈int InitStack(SeqStack * stack){if(stack == NULL){return ERROR ;}stack->top = -1 ; //栈顶下标为-1,即栈为空return OK ;}//判断空栈int StackEmpty(SeqStack * stack){ if(stack == NULL){return ERROR ;} int nTemp = (stack->top == -1 ? 1 : 0 ); return nTemp ; } //判断满栈int Stackfull(SeqStack * stack){if(stack == NULL){return ERROR ;}int temp = (stack->top == STACK_SIZE ? 1 : 0) ;return temp ;}//数据入栈int Pushdata(SeqStack*stack,dataType mydata){if(stack == NULL){return ERROR ;}if(Stackfull(stack) == 1){return ERROR ;}stack->data[++(stack->top)] = mydata ;return OK ;}//出栈int Pop(SeqStack*stack){if(stack == NULL){return ERROR ;}//判断空栈if(StackEmpty(stack) == 1){return ERROR ;}dataType mydata = stack->data[stack->top] ;(stack->top)-- ;return mydata ;}//获取栈顶元素int Gettop(SeqStack *stack){ if(stack == NULL) { return NULL ; } //判断是否为空栈 if(StackEmpty(stack) == 1) { return ERROR ; } return stack->data[stack->top] ; }int main(){SeqStack stack ; //结构体对象if(InitStack(&stack) != OK){return -1 ;}if(StackEmpty(&stack) == 1){printf("是空栈\n") ;}else{printf("不是空栈\n") ;}//数据入栈int i ;for(i=0;i<10;i++){if(Pushdata(&stack,i)!= OK){return -1 ;}}if(Stackfull(&stack) == 1){printf("为满栈\n") ;}else{printf("不为满栈\n") ;}for(i=0;i<10;i++){printf("%4d",Pop(&stack)) ;}if(StackEmpty(&stack) == 1){printf("是空栈\n") ;}else{printf("不是空栈\n") ;}return 0 ;}
链式栈的操作代码:
#include <stdio.h>#include <stdlib.h>#define OK 0 #define ERROR -1#define MALL0C_ERROR -2typedef int dataType ;typedef struct node {dataType data ; //数据域struct node *next ;}Node ;typedef Node * pNode ;typedef struct{pNode top ; //栈顶指针}LinkStack ;//置空栈int InitStack(LinkStack * stack){if(stack == NULL){return ERROR ;}stack->top == NULL ; //栈顶为空return OK ;}//判断空栈int StackEmpty(LinkStack *stack){if(stack == NULL){return ERROR ;}int temp = (stack->top = NULL?1:0);return temp ;}//数据入栈int Pushdata(LinkStack *stack,dataType mydata){if(stack == NULL){return ERROR ;}pNode node = (pNode)malloc(sizeof(Node)/sizeof(char)) ;if(node == NULL){return MALL0C_ERROR ;} node->data = mydata ;node->next = stack->top ;stack->top = node ;return OK ;}//数据出栈int Popdata(LinkStack *stack){if(stack == NULL){return ERROR ;}pNode p = stack->top ; int mydata = p->data ;stack->top = p->next ;free(p) ;return mydata ;}//获取栈顶元素int GetTop(LinkStack *stack){ if(stack == NULL) { return ERROR ; } return stack->top->data ;}int main(){LinkStack lstack ; //定义链式栈对象if(InitStack(&lstack) != OK ){return -1 ;}if(StackEmpty(&lstack) == 1){printf("是空栈\n") ;}else{printf("不是空栈\n") ;}int i ;for(i=0;i<10;i++){if(Pushdata(&lstack,i) != OK){printf("%d 入栈失败!\n",i) ;}}for(i=0;i<10;i++){printf("%4d",Popdata(&lstack)) ;}if(StackEmpty(&lstack) == 1){printf("是空栈\n") ;}else{printf("不是空栈\n") ;}return 0 ;}
阅读全文
0 0
- 自主编程实现栈和链式栈
- 自主编程实现数组队列和链式队列
- 链式栈和链式队
- 自主编程实现单链表
- 自主编程实现哈希表
- C实现顺序栈和链式栈
- c++实现数组栈和链式栈
- 链式栈的表示和实现
- 栈的链式表示和实现
- 数据结构和算法--栈的链式实现
- C++实现链栈和链式队列
- 栈的链式和数组存储实现
- 栈的链式存储结构和实现
- 双链表、链式栈、链式队列 及实现
- 双链表、链式栈、链式队列 及实现
- 栈的链式实现
- 链式栈的实现
- 栈---链式存储实现
- Linux内核页回收swappiness参数确切含义
- Mybatis(一)—实现对数据库的增删改查操作
- 针对架构设计的几个痛点,我总结出的架构原则和模式
- 什么情况下,发送端的send函数成功, 但发送端抓不到对应的网络包?------深入理解send函数
- 如何判断变量是数组还是对象
- 自主编程实现栈和链式栈
- java基础之int数值溢出
- eclipse 和 myeclipse 代码自动提示
- java(9)集合类(转载)
- 计算机网络--HTTP协议
- datagridview实现批量插入与更新
- Debugger APIs
- android 牛人 汇集
- Yann LeCun:深度学习硬件前瞻