栈(ADT)
来源:互联网 发布:手机用usb使用电脑网络 编辑:程序博客网 时间:2024/06/05 22:12
1.概念:栈是限制插入和删除只能在一个位置上进行的表
2.注意知识点:
(1).后进先出的特点(LIFO)
(2).存在某个元素位于栈顶,而该元素是唯一可见的元素。
(3).栈的两种实现方式 :数组、链表
3.栈的基本操作:
1、数组实现:
(1).入栈(push)和出栈(pop)
#include <stdio.h>#define maxsize 10typedef int ElementType;typedef struct{ ElementType data[maxsize]; int top1;//栈的栈顶指针 }stack;void push(stack *s,ElementType num){ if(s->top1 == maxsize-1) { printf("栈满\n"); return; } else { s->data[++(s->top1)] = num; return; }}ElementType pop(stack *s){ if(s->top1 == -1) { printf("栈空!\n"); return 0; } else return s->data[(s->top1)--];}int main(){ stack s; int t; for(int i = 0;i<3;i++) { push(&s,i); } for(int i =0;i<3;i++) { t = pop(&s); printf("%d",t); }}
运行结果 :
(2).两个堆栈的实现入栈、出栈
#include <stdio.h>#define maxsize 10typedef struct{ int data[maxsize]; int top1 ;//栈1的栈顶指针 int top2 ;//栈2 的栈顶指针 }stack;void push(stack *s,int num,int tag){ if(s->top1 == s->top2)//**判断栈是否满** printf("栈满!\n"); else { if(tag == 1) { s->data[++(s->top1)] = num;//对第一个栈进行操作 } else s->data[--(s->top2)] = num;// 对第二个栈进行操作 } } int pop(stack *s,int tag){ if(tag == 1) { if(s->top1 == -1) printf("栈空!\n"); else return s->data[(s->top1)--];//对第一个栈进行操作 } else { if(s->top2 == maxsize) printf("栈空!\n"); else return s->data[(s->top2)++]; } }int main(){ int tag; scanf("%d",&tag); int i,t; stack s; s.top1 = -1;s.top2 = maxsize; for(i = 0;i<4;i++) { push(&s,i,tag); } for(i = 0;i<4;i++) { t = pop(&s,tag); printf("%d\t",t); } }
运行结果:
(3)、判断栈是否为空
int Isempty(stack *s){ return s->top1 == -1;}
(4)、判断栈是否满
int IsFull(stack *s){ return s->top1 == maxsize-1;}
2、链表实现:
(1)、建立空栈并判断是否为空
#include <stdio.h>#include <stdlib.h> typedef struct Node{ int data; struct * next;}stack;stack *createstack(stack *s){ s = (stack *)malloc(sizeof(struct Node)); if(s == NULL) { printf("no space!\n"); return NULL; } else { s->next = NULL; return s; } }int Isempty(stack *s){ return s->next == NULL;//判断栈是否为空,为空返回1,否返回0 }int main() { stack *s; s = createstack(s); int n = Isempty(s); printf("%d",n);}
输出结果:
(2)、push(入栈 )(因为是动态申请内存,不用判断是否满栈)
void push(int num,stack *s){ //将num压入栈 stack *p = (stack*)malloc(sizeof(stack)); p->data = num; p->next = s->next; s->next = p; }
(3)、从栈弹出元素(pop)并返回栈顶元素
int pop(stack *s){ //删除并返回栈顶元素 stack *p; int temp; if(Isempty(s)) { printf("栈空!\n"); return 0; } else { p = s->next; s->next = p->next; temp = p->data; free(p); return temp; }}
链表实现的完整代码:
#include <stdio.h>#include <stdlib.h> typedef struct Node{ int data; struct Node * next;}stack;stack *createstack(stack *s){ s = (stack *)malloc(sizeof(struct Node)); if(s == NULL) { printf("no space!\n"); return NULL; } else { s->next = NULL; return s; } }int Isempty(stack *s){ return s->next == NULL;//判断栈是否为空,为空返回1,否返回0 }void push(int num,stack *s){ //将num压入栈 stack *p = (stack*)malloc(sizeof(stack)); p->data = num; p->next = s->next; s->next = p; } int pop(stack *s){ //删除并返回栈顶元素 stack *p; int temp; if(Isempty(s)) { printf("栈空!\n"); return 0; } else { p = s->next; s->next = p->next; temp = p->data; free(p); return temp; }} int main() { stack *s;int num; s = createstack(s); int n = Isempty(s); for(int i = 0;i<2;i++) { push(i,s); } for(int i = 0;i<2;i++) { num = pop(s); printf("%d\t",num); }}
运行结果:
阅读全文
1 0
- 栈(ADT)
- 栈ADT
- ADT栈
- 栈ADT
- 栈ADT
- 栈ADT
- 栈ADT
- 数据结构(二)之栈ADT
- Android ADT Bundle(Eclipse with ADT) ADT R23
- Android ADT Bundle(Eclipse with ADT) ADT R23.0.2
- 【数据结构】回顾栈ADT和队ADT
- 栈ADT实现
- 栈 ADT 结构
- 栈ADT实现
- 数据结构 -- 栈ADT
- ADT
- adt
- ADT
- 网络请求的一些步骤和操作
- 注册表读取CPU信息
- Saliency Detection by Multi-Task Sparsity Puisuit
- html标签使用注意事项
- CUDA之同步函数详解
- 栈(ADT)
- mysql数据库方言的选择问题
- macOS High Sierra公测版申请及下载安装
- 《算法概论》习题解答 8.10
- 剑指offer--面试题9:用两个栈实现队列
- 剑指offer | 训练题58:按之字形打印二叉树
- 磁珠还可以用来抑制纹波噪声?
- (转)投资很难赚到你不信的那份钱︱投资道
- 第八章课后题_1