#pragma once
#include<iostream>
#include<cstdlib>
#include<stdbool.h>
using namespace std;
typedef char ElemType;
//typedef int ElemType;
typedef struct StackNode
{
ElemType data;
struct StackNode* next;
}StackNode, * LinkStack;
bool InitStack(LinkStack& s); //初始化
bool PushStack(LinkStack& s, ElemType x);//入栈
bool PushStack2(LinkStack& s);//多次进栈
bool PopStack(LinkStack& s, ElemType& x);//出栈
bool GetTop(LinkStack& s, ElemType &x);//获取栈顶元素
bool Print(LinkStack& s);//遍历
int Length(LinkStack& s);//求长度
bool ClearStack(LinkStack& s);//清空栈,让s指向空(而销毁栈,就是栈顶指针也free掉)
void menu();//菜单
#include"LinkStack1.h"
bool InitStack(LinkStack& s)//初始化
{
s = NULL;
return true;
}
bool PushStack(LinkStack& s, ElemType x)//进入栈
{
StackNode* p=(StackNode*)malloc(sizeof(StackNode));
p->data = x;
p->next = s;
s = p;//修改栈顶指针
return true;
}
bool PushStack2(LinkStack& s)//多次进栈
{
ElemType x = 0;
cout << "请依次输入数据元素:" << endl;
cin >> x;
while(x!='A')
//while (x != 999)
{
PushStack(s, x);
cin >> x;
}
cout << endl;
return true;
}
bool PopStack(LinkStack& s, ElemType& x)//出栈,要释放掉之前的空间
{
StackNode* p;
p = (StackNode*)malloc(sizeof(StackNode));
if (s == NULL)
{
cout << "栈已空!" << endl;
return false;
}
else
{
p = s;
x = s->data;
s = s->next;
free(p);
}
return true;
}
bool GetTop(LinkStack& s, ElemType &x)//读/取栈顶元素
{
if (s == NULL)
return false;
else
{
x = s->data;
}
return true;
}
bool Print(LinkStack &s)//遍历
{
StackNode* p = s;
if (p == NULL)
{
return false;
}
while(p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
return true;
}
int Length(LinkStack& s)//求长度
{
int j = 0;
if (s == NULL)
return 0;
else
{
StackNode* p;
p = s;
while (p != NULL)
{
j++;
p = p->next;
}
}
return j;
}
bool ClearStack(LinkStack& s)//清空栈
{
while (s != NULL)
{
StackNode* p;
p = s;
s = s-> next;
free(p);
}
return true;
}
void menu() //显示菜单
{
printf("\n");
cout << "-------------------------------------------------欢迎使用该系统-------------------------------------------------" << endl;
cout << " 1、入栈 " << endl;
cout << " 2、出栈 " << endl;
cout << " 3、求元素个数 " << endl;
cout << " 4、取栈顶元素 " << endl;
cout << " 5、遍历 " << endl;
cout << " 6、清空栈 " << endl;
cout << " 7、退出系统 " << endl;
}
#include"LinkStack1.h"
int main()
{
/*LinkStack s;
InitStack(s);*/
/*PushStack(s, 1);
PushStack(s, 3);
Print(s);*/
/*ElemType x = 0;
cout << "请依次输入数据元素:" << endl;
cin >> x;
while (x != 0)
{
PushStack(s, x);
cin >> x;
}
cout << endl;
Print(s);*/
/*ElemType x=0;
GetTop(s, x);
cout << x;*/
//PushStack2(s);
//Print(s);
//cout<<Length(s);
//return 0;
LinkStack s;
InitStack(s);
while (1)
{
menu();
cout << "请输入菜单编号:";
int number;
cin >> number;
switch (number)
{
case 1:
PushStack2(s);
break;
case 2:
ElemType x2;
if (s == NULL)
cout << "栈已空!" << endl;
else
{
PopStack(s, x2);
cout << "出栈完成!" << endl;
}
break;
case 3:
Length(s);
cout << "元素个数是:" << Length(s) << endl;
break;
case 4:
ElemType x3;
GetTop(s, x3);
if (s == NULL)
cout << "栈已空!" << endl;
else
cout << "栈顶元素是:" << x3;
break;
case 5:
if (s == NULL)
cout << "栈已空!" << endl;
else
Print(s);
break;
case 6:
ClearStack(s);
cout << "清空完成!" << endl;
break;
case 7:exit(0); break; //退出
default:printf("输入有误!");
}
}
return 0;
}