链式栈
//
//Description:链式栈
//
#include <iostream>
#include <malloc.h>
using namespace std;
typedef int ElemType;
typedef int Status;
//--------链式栈定义--------
typedef struct Stack
{
ElemType data;
struct Stack *next;
}Stack, *LinkStack;
Stack *p=NULL;
static int i = 0;//--------
//---------------创建链表-----------------------
void CreateList_LS(LinkStack &LS, int n)
{
LS = (LinkStack)malloc(sizeof(Stack));
LS->next = NULL;
for (int i = 1; i <= n; i++)
{
p = (LinkStack)malloc(sizeof(Stack));
cout << "\n请输入第" << i << "个链式栈结点的值\t";
cin >> (p->data);
p->next = LS->next;
LS->next = p;
}
}
//---------链式栈中查找栈顶结点的值------------
Status GetTop(LinkStack &LS, ElemType &e)
{
if (LS->next == NULL)
{
cout << "目前为空栈,无栈顶元素!" << endl;
return 0;
}
e = LS->next->data;
cout << "\n\n当前栈顶元素为" << e << endl;
return 1;
}
//向栈顶插入一个元素
Status Push(LinkStack &LS, ElemType e)
{
p = (LinkStack)malloc(sizeof(Stack));
p->data = e;
if (LS->next == NULL)
{
cout << "尚未执行插入操作前为一个空栈!" << endl;
}
else
{
p->next = LS->next;
LS->next = p;
}
return 1;
}
//删除栈顶元素
Status Pop(LinkStack &LS, ElemType &e)
{
i++;
if (LS->next == NULL)
{
cout << "目前为空栈,无法执行删除栈顶元素的操作!" << endl;
return 0;
}
else
{
e = LS->next->data;
LS->next = LS->next->next; //*(想想为什么不能写为 LS->next=p->next; )第一次执行删除操作时存在p,以后再进行删除操作时就可能不存在p了。
cout << "\n刚才所删除的结点其值为" << e << endl;
if (i == 1)
{
free(p);
}//-----*********重要!!!***************------------
return 1;
}
}
//检测该链式栈是否完全正确,通过不断地删除栈顶元素和获取栈顶元素
void Check_RightOrNot(LinkStack &LS)
{
cout << "\n以下为 快速验证链式栈是否完全正确 的操作\n" << endl;
int ran;
while (LS->next != NULL)
{
Pop(LS, ran);
GetTop(LS, ran);
}
}
void main()
{
cout << "\n\t====================链式栈==================" << endl;
int num;
cout << "请输入初始时链式线性表中结点的个数" << endl;
cin >> num;
LinkStack LS;
CreateList_LS(LS, num);
ElemType value;
GetTop(LS, value);
cout << "\n请输入一个欲插入的" << "链式栈结点的值\t";
cin >> value;
Push(LS, value); GetTop(LS, value);
Pop(LS, value); GetTop(LS, value);
Check_RightOrNot(LS);
}