栈的应用(一)
前段时间有事一直没复习,今天用链表实现一个简单的行编辑程序。#是退格,*是清除前面所有字符,!表示输入结束。
结构体
这里采用的是双向链表,方便后面逆序打印
struct stack
{
struct stack* next;
struct stack* last;
struct stack* base;
struct stack* top;
char info;
};
初始化一个链栈
设置了一个栈底和栈顶节点,都没有存放数据
struct stack* InitStack()
{
struct stack* s;
s = new stack;
s->base = new stack;
s->top = new stack;
s->base->next = s->top;
s->top->last = s->base;
s -> base->last = nullptr;
s->top->next = nullptr;
return s;
}
入栈
struct stack* PushStack(struct stack* s, char data)
{
struct stack* s1;
s1 = new stack;
s->top->info = data;
s1->last = s->top;
s->top->next = s1;
s->top = s1;
s1->next = nullptr;
return s;
}
出栈
struct stack* PopStack(struct stack* s)
{
struct stack* s1;
s1 = new stack;
s1 = s->top->last;
s->top->last -> last->next = s->top;//因为栈顶是没有存放数据的,出栈的应该是栈顶的前一个,所以就将栈顶的前一个的前一个连接到栈顶
s->top->last = s->top->last->last;
free(s1);
return s;
}
清空栈
struct stack* clear(stack* s)
{
s->base->next = s->top;
s->top->last = s->base;
return s;
}
完整的程序
#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
struct stack
{
struct stack* next;
struct stack* last;
struct stack* base;
struct stack* top;
char info;
};
struct stack* InitStack()
{
struct stack* s;
s = new stack;
s->base = new stack;
s->top = new stack;
s->base->next = s->top;
s->top->last = s->base;
s -> base->last = nullptr;
s->top->next = nullptr;
return s;
}
struct stack* PushStack(struct stack* s, char data)
{
struct stack* s1;
s1 = new stack;
s->top->info = data;
s1->last = s->top;
s->top->next = s1;
s->top = s1;
s1->next = nullptr;
return s;
}
struct stack* PopStack(struct stack* s)
{
struct stack* s1;
s1 = new stack;
s1 = s->top->last;
s->top->last -> last->next = s->top;
s->top->last = s->top->last->last;
free(s1);
return s;
}
struct stack* clear(stack* s)
{
s->base->next = s->top;
s->top->last = s->base;
return s;
}
int main()
{
struct stack* s;
s = InitStack();
char str[100];
cin >> str;
for (int i = 0; i < 100; i++)
{
if (str[i] == '!')
break;
else if (str[i] == '#')
{
s = PopStack(s);
}
else if (str[i] == '*')
{
s=clear(s);
}
else
{
s = PushStack(s, str[i]);
}
}
struct stack* p;
p = new stack;
p = s->base->next;
while (p->next!= nullptr)
{
cout << p->info ;
p = p->next;
}
system("pause");
return 0;
}
结果
一开始写的时候没有考虑输入空格,所以用的cin,可以改成其他字符串录入方式。看起来是一个栈,其实还是用的双向链表,感觉还是写的比较麻烦,用顺序表应该要简单一些,下次有时间再写一次顺序表实现。