堆栈的使用

来源:互联网 发布:淘宝宝贝编辑助手 编辑:程序博客网 时间: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);}}


原创粉丝点击