【问题描述】
假设给定的整数栈初始状态为空,栈的最大容量为100。从标准输入中输入一组栈操作,按操作顺序输出出栈元素序列。栈操作:1表示入栈操作,后跟一个整数(不为1、0和-1)为入栈元素;0表示出栈操作;-1表示操作结束。
【输入形式】
从标准输入读取一组栈操作,入栈的整数和表示栈操作的整数之间都以一个空格分隔。
【输出形式】
在一行上按照操作的顺序输出出栈元素序列,以一个空格分隔各元素,最后一个元素后也要有一个空格。如果栈状态为空时进行出栈操作,或栈满时进行入栈操作,则输出字符串“error”,并且字符串后也要有一空格。所有操作都执行完后,栈也有可能不为空。
【样例输入】
1 3 1 5 1 7 0 0 1 8 0 1 12 1 13 0 0 0 0 1 90 1 89 0 -1
【样例输出】
7 5 8 13 12 3 error 89
【样例说明】
入栈元素依次为3、5、7,然后有两次出栈动作,所以先输出7和5,这时栈中只有元素3;之后元素8入栈,又出栈,输出8;随后元素12和13入栈,再进行4次出栈操作,输出13、12和3,这时栈为空,再进行出栈操作会输出error;最后90和89入栈,进行一次出栈操作,输出89,栈中剩余1个元素。
【评分标准】
该题要求按照操作的顺序输出出栈元素序列,提交程序名为stack.c。
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node
{
int data;
struct Node *pNext;
}Node;
typedef struct Stack
{
Node * pTop;
Node * pButtom;
}Stack;
void init_stack(Stack * ps);//初始化栈
int is_empty(Stack *ps);//判断是否为空栈
void push_stack(Stack *ps, int val);
int pop_stack(Stack *ps, int *pVal);
int main(int argc, char *argv[])
{
int count = 0;
int flg = 0;
int inputOperation[100] = {0};
//测试数据:1 3 1 5 1 7 0 0 1 8 0 1 12 1 13 0 0 0 0 1 90 1 89 0 -1
int *p = inputOperation;
/*printf("请输入栈操作序列:\n");*/
do //输入操作序列
{
scanf("%d",&flg);
inputOperation[count++] = flg;
}while(flg != -1);
Stack s;//创建一个链栈
init_stack(&s);//并初始化该链栈
p = inputOperation;
while(*p != -1)
{
if (*p == 1)
{
if (*(p+1) == 1 || *(p+1) == 0 || *(p+1) == -1)//整数不能和操作数相同
{
printf("操作序列输入错误!\n");
break;
}
push_stack(&s, *(p+1));//将当前指针后一个整数入栈
p+=2;//将指针指向下一个操作数
}
else if (*p == 0)
{
int popVal = 0;
if(pop_stack(&s, &popVal))//将出栈元素放到popVal中
printf("%d ",popVal);
else
printf("error ");
p+=1;//将指针指向下一个操作数
}
}
printf("\n");
system("pause");
return 0;
}
void init_stack(Stack * ps)
{
ps->pButtom = ps->pTop = (Node *) malloc (sizeof(Node));
ps->pButtom->pNext = NULL;
}
int is_empty(Stack *ps)
{
if (ps->pTop == ps->pButtom)
return 1;
else
return 0;
}
void push_stack(Stack *ps, int val)
{
Node * pNew = (Node *) malloc (sizeof(Node));
pNew->data = val;
pNew->pNext = ps->pTop;
ps->pTop = pNew;
return;
}
int pop_stack(Stack *ps, int *pVal)
{
Node *pWork = ps->pTop;
if (is_empty(ps))
return 0;
*pVal = ps->pTop->data;
ps->pTop = ps->pTop->pNext;
free(pWork);
return 1;
}