重构之路--代码实现
重构之路--代码实现
git链接:
Operation3.1.1代码上次就已经实现了,这次加了一些新的功能,实现分数表达式。
栈
栈是一种最常用的和最重要的数据结构,是一种只能在一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。栈顶当前位置是动态的,栈顶当前位置由一个称为栈顶指针的位置指示器表示。表的另一端称为栈底。当栈中没有数据元素时,称为空栈,栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。
栈的主要特点是“后进先出”,即后入栈的元素先弹出。每次进栈的数据元素都放在原当前栈顶元素之前,成为新的栈顶元素,每次出栈的数据都是原当前栈顶元素。
栈的基本操作
- 初始化栈, init()
- 入栈,push()
- 出栈,pop()
- 取栈顶元素,gettop()
- 判断栈是否为空 empty()
- 显示栈元素 display()
- 释放栈 setnull()
当然,这些操作你可以直接用stl模板,也可以自定义栈,比如数组仿真或者指针仿真。模板的话可以自行百度,而我用的是数组仿真,下面例子就演示指针仿真的吧。
/*堆栈演示!*/
#include <iostream>
using namespace std;
typedef struct Stack *link;
typedef struct Stack Snode;
struct Stack
{
int data;
struct Stack *next;
};
link init()//初始化栈
{
link p;
p=NULL;
return p;
}
link push(link Head,int x)//入栈
{
link p;
p=new Snode;
if(p==NULL)
{
cout<<"\nMemory Error\n";
return Head;
}
p->data=x;
p->next=Head;
return p;
}
link pop(link Head)//出栈
{
link p;p=Head;
if(p==NULL)
cout<<"\nStack is Empty!\n";
else
{
p=p->next;
delete(Head);
}
return p;
}
link setnull(link Head)//释放栈
{
link p;p=Head;
while(p!=NULL)
{
p=p->next;
delete(Head);
Head=p;
}
return Head;
}
int lenth(link Head)// 获得栈内元素个数
{
int len=0;
link p;
p=Head;
while(p!=NULL)
{
len++;
p=p->next;
}
return len;
}
int gettop(link Head)//获得栈顶元素
{
if(Head==NULL)
{
cout<<"\nStack is Empty!\n";
return -1;
}
else
return Head->data;
}
void display(link Head)//显示栈内元素
{
link p;p=Head;
if(p==NULL)
cout<<"\nStack is empty\n";
else
do
{
cout<<p->data<<" ";
p=p->next;
}while(p!=NULL);
}
int empty(link Head)//判断栈是否为空
{
if(Head==NULL)
return 1;
else
return 0;
}
int main()
{
int i,x;
link head1;
head1=init();
while(i!=6)
{
system("cls");
cout<<"\n 1.Input a stack data";
cout<<"\n 2.Output a stack data";
cout<<"\n 3.Empty or Not";
cout<<"\n 4.Display a top of stack";
cout<<"\n 5.Display the lenth of stack";
cout<<"\n 6.Exit and Free Stack\n";
cout<<"\n Stack is: ";
display(head1);
cout<<"\n";
cin>>i;
switch(i)
{
case 1: while(1)
{
system("cls");
cout<<"\n -.Input a stack data";
cout<<"\n -.Output a stack data";
cout<<"\n -.Empty or Not";
cout<<"\n -.Display a top of stack";
cout<<"\n -.Display the lenth of stack";
cout<<"\n -.Exit and Free Stack\n";
cout<<"\n Stack is: ";
display(head1);
cout<<"\n";
cout<<"\ninput a number: until enter -1:\n";
cin>>x;
if(x==-1)
break;
head1=push(head1,x);
}
break;
case 2: head1=pop(head1);
break;
case 3: if(empty(head1))
cout<<"\nStack is empty\n";
else
cout<<"\nStack is not empty\n";
system("pause");
break;
case 4: cout<<"\n The top is "<<gettop(head1)<<endl;
system("pause");
break;
case 5: cout<<"\n The length of stack is "<<lenth(head1)<<endl;
system("pause");
break;
}
}
system("cls");;
head1=setnull(head1);
display(head1);
getchar();
return 0;
}