本帖最后由 关键是感觉 于 2018-6-20 18:18 编辑 #include "stdio.h"
#include "malloc.h"
typedef struct sData{
char n;
}sData;
typedef struct sStack{
sData * back;
sData * top;
int size;
}sStack;
sStack inital(int size){ //初始化栈空间
sStack p_stack;
p_stack.back = (sData *)malloc(sizeof(sData) * size);
p_stack.top = p_stack.back;
p_stack.size=size;
return p_stack;
}
int is_overflow(sStack *stack){ //检查栈顶
return (stack->top-stack->back)>stack->size-1 || (stack->top<stack->back);//LOOP 栈
}
void push(sStack *stack,int n){
if(is_overflow(stack)){
stack->top=stack->back; //溢出栈顶后置零
}
stack->top->n=n;
stack->top++; //栈顶+1
}
int is_overflow1(sStack *stack){ //检查栈底
return stack->back>=stack->top;
}
sData * pop(sStack *stack){ //栈顶-1
if(is_overflow1(stack)){
stack->top=stack->back+stack->size; //LOOP 栈
}
return --stack->top;
}
int main(){
sStack p_stack,p_stack1;
int i=0,count=0;
char ch;
p_stack = inital(100);
p_stack1 = inital(100);
while((ch=getchar())!='\n'){
switch(ch){
case '#': //前一个字符无效
count-=1;
p_stack.top-=1;
break;
case '@': //全部无效
count=0;
p_stack.top=p_stack.back; //清空
break;
default:
count++;
push(&p_stack,ch);
break;
}
}
count=p_stack.top-p_stack.back;
for(i=0;i<count;i++){
char ch =(*pop(&p_stack)).n;
//printf("%c",ch);
push(&p_stack1,ch);
}
for(i=0;i<=count;i++){
printf("%c",(*pop(&p_stack1)).n);
}
free(p_stack.back);
free(p_stack1.back);
return 0;
}
这个《C语言经典编程282例》208题,大概效果是这样
输入:12346#5
输出:12345 “#相当于退格一位”
输入:123465@abcd
输出:abcd “应该不难理解这个效果吧”
其实程序简单。就是 压栈 出栈 初始化栈区域 还有栈顶溢出检查 栈底溢出检查。
|