原题链接:堆栈的使用
解题思路:
①:输入操作次数n
②:输入n次操作
③:P x :代表push操作,把x入栈
④:O :代表出栈操作
⑤:A :当栈不为空的时候,输出栈顶元素,栈为空的时候输出E
注意事项:
1):用字符串c[2]存放输入的P O A,虽然一次只存放一个字符,但是这样的好处是不用重复清空缓存区
的回车
2):c[2]长度一定要为2,应为c[0]存放P O A,C[1]='\0', 若长度为1提交超时
3):一般Push操作要判断栈是否溢出(链栈除外),这题可以不用,因为开辟的栈大小为n,n步以内不会满
4):Pop操作一定要判断栈是否为空,空则不能top--,否则会栈下溢
5):这里栈顶指针top起始为-1,也可以为0,但要修改其余操作函数
6):每组数据完后要换行
参考代码:
#include <stdio.h>
#include <malloc.h>
typedef struct Stack_
{
int *Data;
int top;
int length; /*空间长度,判断栈是否溢出使用*/
}*Stack, STACK;
void init_( Stack s ); /*初始化栈*/
void Push( int x, Stack s ); /*入栈*/
void Pop( Stack s ); /*出栈*/
int Gettop( Stack s ); /*获得栈顶元素*/
int StackEmpty( Stack s ); /*判断栈空*/
/*----------------------------------------------------------*/
int main()
{
int n;
char c[2];
STACK s;
while ( scanf( "%d", &n ) != EOF )
{
getchar(); /*清空缓存区*/
s.Data = (int *) malloc( n * sizeof(int) );
s.length = n; /*保存栈大小*/
init_( &s ); /*栈初始化*/
for ( int i = 0; i < n; i++ )
{
scanf( "%s", c );
switch ( c[0] )
{
case 'P': { int x; scanf( "%d", &x ); Push( x, &s ); break; }
case 'O': { Pop( &s ); break; }
case 'A': { if ( StackEmpty( &s ) ) /*栈空输出E,不为空输出栈顶元素*/
printf( "E\n" );
else
printf( "%d\n", Gettop( &s ) );
break; }
}
}
free( s.Data ); /*释放空间*/
printf( "\n" ); /*每组数据空一行*/
}
return(0);
}
void init_( Stack s ) /*初始化栈*/
{
s->top = -1; /*栈顶指针这里规定从-1,开始*/
}
/*----------------------------------------------------------*/
void Push( int x, Stack s ) /*入栈操作*/
{
if ( s->top + 1 >= s->length )
return; /*栈溢出*/
else
s->Data[++s->top] = x; /*因为top起始为-1,所以要先++,找到push位置*/
}
/*----------------------------------------------------------*/
void Pop( Stack s ) /*出栈*/
{
if ( StackEmpty( s ) ) /*栈空则返回*/
return;
else /*不空则pop*/
s->top--;
}
/*----------------------------------------------------------*/
int Gettop( Stack s ) /*获得栈顶元素*/
{
int x = s->Data[s->top];
return(x);
}
/*----------------------------------------------------------*/
int StackEmpty( Stack s ) /*判断栈空*/
{
if ( s->top == -1 )
return(1);
else
return(0);
}别忘点赞哦-.-
0.0分
13 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复