#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREACE 10
typedef struct
{
char *top;
char *base;
int stacksize;
}stack;
int main()
{
// 创建栈
void InitStack(stack *s);
// 入栈
void Push(stack *s, char e);
// 出栈
void Pop(stack *s);
// 出栈并显示每一个出栈的字符
char PopStack(stack *s);
// 请空栈
void ClearStack(stack *s);
// 计算有效栈的长度,判断是否栈空
int Top_Base(stack *s);
// 定义
stack s,s2;
char temp;//暂时接受getchar()输入的字符
char elemtemp;
int length;
InitStack(&s);
// 输入一行直到按下回车结束行输入
temp=getchar();
while(temp != '\n')
{
// 判断temp是字符还是#还是@,选用switch结构
switch(temp)
{
// 删除一个字符,即出栈一次
case '#':Pop(&s);break;
// 删除前面输入的一行,即请空栈
case '@':ClearStack(&s);break;
// 正确接受字符,即入栈一次
default:Push(&s, temp);
}
temp = getchar();
}
// 输出应该正确显示的字符到屏幕:出栈->入新栈->再出栈 并显示输出
InitStack(&s2);
length = Top_Base(&s);
while(length != 0)
{
elemtemp = PopStack(&s);
Push(&s2, elemtemp);
length = Top_Base(&s);
}
length = Top_Base(&s2);
while(length !=0 )
{
elemtemp = PopStack(&s2);
printf("%c",elemtemp);
length = Top_Base(&s2);
}
return 0;
}
void InitStack(stack *s)
{
s->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char *));
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
}
void Push(stack *s, char e)
{
// 判断栈满,若栈满则扩充
if(s->top - s->base == s->stacksize)
{
s->base = (char *)realloc(s->base, STACKINCREACE * sizeof(char));
// 如果内存分配失败,则退出
if(!s->base)
exit(0);
// 扩充成功修改栈指标
s->top = s->base + s->stacksize;
s->stacksize += STACKINCREACE;
}
*(s->top) = e;
s->top++;
}
void Pop(stack *s)
{
//若栈空,则退出
if(s->base == s->top)
exit(0);
s->top = s->top - 1;
}
void ClearStack(stack *s)
{
s->top = s->base;
}
char PopStack(stack *s)
{
char e;
e = *(s->top-1);
s->top--;
return e;
}
int Top_Base(stack *s)
{
int length;
length = s->top - s->base;
return length;
}
总结:
1、循环输入:要先getchar()输入一次,判断是否是回车结束符,不是再读入内存并在此getchar()输入,直到回车
2、switch……case结构注意除default之外都要加break;
3、有多于一个栈的时候每次调用栈时要注意调用的是哪个栈,要细心!