堆栈的使用
来源:互联网 发布:淘宝宝贝编辑助手 编辑:程序博客网 时间:2024/06/07 12:26
前言
大年初七回到学习开始复习算法,重新看了这个堆栈的代码,实在不明白为什么这么多人会踩,感觉链栈实现的不错啊,增加一个顺序栈ac的代码,希望大家评价的时候真的是看了我的代码,写的不好可以留言指导我
题目
题目描述: 堆栈是一种基本的数据结构。堆栈具有两种基本操作方式,push 和 pop。Push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。输入: 对于每组测试数据,第一行是一个正整数 n,0<n<=10000(n=0 结束)。而后的 n 行,每行的第一个字符可能是'P’或者'O’或者'A’;如果是'P’,后面还会跟着一个整数,表示把这个数据压入堆栈;如果是'O’,表示将栈顶的值 pop 出来,如果堆栈中没有元素时,忽略本次操作;如果是'A’,表示询问当前栈顶的值,如果当时栈为空,则输出'E'。堆栈开始为空。输出: 对于每组测试数据,根据其中的命令字符来处理堆栈;并对所有的'A’操作,输出当时栈顶的值,每个占据一行,如果当时栈为空,则输出'E’。当每组测试数据完成后,输出一个空行。样例输入:3AP 5A4P 3P 6O A0样例输出:E53
AC代码
顺序栈ac代码
#include <stdio.h>#include <stdlib.h>#define max 10001struct stack{int data[max];int top;};int main(){int i, n, a;struct stack *sta;char ch;while(scanf("%d", &n) != EOF){if(n == 0)break;//初始化栈sta = (struct stack *)malloc(sizeof(struct stack));sta->top = 0;//堆栈操作for(i = 0; i < n; i ++){getchar();scanf(" %c", &ch);switch(ch){case 'A' :if(sta->top > 0){printf("%d\n", sta->data[sta->top - 1]);}else{printf("E\n");}break;case 'O' :if(sta->top > 0)-- sta->top;break;case 'P' :scanf("%d", &a);sta->data[sta->top ++] = a;break;}}printf("\n");}return 0;}
链栈ac代码
#include <stdio.h>#include <stdlib.h>struct stacknode{int data;struct stacknode *next;};typedef struct{struct stacknode *top;//栈顶指针}linkstack;void initstack(linkstack *s);void push(linkstack *s, int x);void pop(linkstack *s);void stacktop(linkstack *s);int main(){int n, i, x;char ch;while(scanf("%d",&n) != EOF){//循环结束条件if(n <= 0 || n > 10000)break;//循环操作linkstack *s = malloc(sizeof(struct stacknode));initstack(s);for(i = 0; i < n; i ++){getchar();scanf(" %c",&ch);switch(ch){case 'P'://接受入栈数据scanf("%d",&x);push(s, x);break;case 'A'://输出栈顶元素stacktop(s);break;case 'O'://出栈pop(s);break;}}printf("\n");}return 0;}void initstack(linkstack *s){s -> top = NULL;}void push(linkstack *s, int x){struct stacknode *p;p = malloc(sizeof(struct stacknode));if(p != NULL){p -> data = x;p -> next = s -> top;s -> top = p;}}void pop(linkstack *s){struct stacknode *p = s -> top;if(p){s -> top = p -> next;free(p);}}void stacktop(linkstack *s){int x;if(s -> top == NULL){printf("E\n");}else{x = s -> top -> data;printf("%d\n",x);}}
- 堆栈的使用
- 堆栈的使用
- 数据结构---->堆栈的使用
- 堆栈的使用
- 堆栈的使用
- Docker的堆栈使用
- 堆栈的使用
- 题目28:堆栈的使用
- jobdu 28 堆栈的使用
- 题目1108:堆栈的使用
- 题目1108:堆栈的使用
- 题目1108:堆栈的使用
- 题目1108:堆栈的使用
- 使用TCmalloc的堆栈检查
- 调试之堆栈的使用
- 使用TCMalloc的堆栈检查
- 题目1108:堆栈的使用
- 使用TCMalloc的堆栈检查
- hdu 1159 Common Subsequence 最长公共子序列
- 在MFC中添加用户自定义消息【转载】
- 解决MyEclipse中使用Alt+/没有提示的问题
- 用快排实现寻找数组中的最小k个数
- 线程的创建和退出
- 堆栈的使用
- Hibernate基础之一:Hibernate4.1.6第一个程序
- hdu 1599 find the mincost route
- hdu 1160 FatMouse's Speed
- android 基站定位
- zoj3656_Bit Magic(可以用2-SAT,我这里没用这个)
- 检查一个数组是否出现重复数字的算法(时间复杂度O(n的平方))
- MYSQL--事务处理
- 关于cdmaCellLocation的用法