#include<stdio.h>
#include<iostream>
using namespace std;
//等于说,链表的头就是栈顶,因此在退栈的时候直接让指针后继就可以
//在进行新元素插入的时候让新建立的节点的指针后继指向栈顶指针就可以
typedef struct Node{
int data;
struct Node *next;
}Node,*Link;
struct stack{
Link top;
int count;
};
void Stackinit(stack *S){
S->top=(Link)malloc(sizeof(Node));
if(!S->top)
exit(1);
S->top=NULL;
S->count=0;
}//初始化栈
void Push(stack *S,int e){
Link s=(Link)malloc(sizeof(Node));
if(s==NULL)
cout<<"申请内存空间失败"<<endl;
s->data=e;
s -> next = S -> top; //把当前的栈顶赋值给新的元素的后继(指针的指向)
S -> top = s; //新的节点赋值给栈顶指针(即让新元素成为栈顶元素)
S->count++;
}//入栈
bool isEmpty(stack *ps){
if(ps->count==0)
return true;
return false;
}//判断栈是否为空
void PoP(stack *S){
if(isEmpty(S))
cout<<"当前栈为空";
Link z;//临时节点
z=S->top;
S->top=S->top->next;
free(z);
S->count--;
}//出栈;
void Travel(stack *S){
Link q=S->top;
while(q){
cout<<q->data<<" ";
q=q->next;
}
}//遍历栈
int gettop(stack *S){
if(isEmpty(S)){
cout<<"当前栈为空";
return 0;
}
return S->top->data;
}///输出栈顶元素
int getlength(stack *S){
return S->count;
}//输出栈内元素个数
int main(){
stack p;
int i,j,temp;
int choose;
do{
system("cls");
cout << "1:初始化栈:" << endl;
cout << "2:遍历栈:" << endl;
cout << "3:压栈:" << endl;
cout << "4:出栈:" << endl;
cout << "5:取栈顶的元素值:" << endl;
cout << "6:栈是否为空:" << endl;
cout << "7:获取栈的长度:" << endl;
cout << "8:退出:" << endl;
cout << "请输入你的选择[1-8]:" << endl;
cin >> choose;
switch(choose){
case 1:{
Stackinit(&p);
cout<<"请输入5个数作为初始化数据"<<endl;
for(i=0;i<5;i++)//给栈初始化一些数据
{
cin>>temp;
Push(&p,temp);
}
break;
}
case 2:{
Travel(&p);
break;
}
case 3:{
cin>>temp;
Push(&p,temp);
break;
}
case 4:{
PoP(&p);
break;
}
case 5:{
cout<<gettop(&p);
break;
}
case 6:{
if(isEmpty(&p)) cout<<"空";
cout<<"非空";
break;
}
case 7:{
cout << "栈的长度为:" << getlength(&p) << endl;
break;
}
}
system("pause");//暂停一下
}while(choose!=8);
}
数据结构之链栈基本操作的实现代码及解(C语言描述)
猜你喜欢
转载自blog.csdn.net/huadong_xiaolin/article/details/119513755
今日推荐
周排行