了解了数据结构栈的基本知识
①先进后出,类似于装羽毛球筒和弹夹装子弹并且打出
②操作包括入栈,出栈,打印栈,检查栈顶元素,初始化栈结构体和栈结点结构体的操作
③注意事项:不同结构体指针赋值时强制类型转换的必要性,函数与主函数之间用指针连接修改的操作
④封装的思想:程序开始初始化一个空栈并且封装一个函数用来专门创造一个新结点使程序简介
⑤如何操作一个指针变量?
int a=10;
int *p=&a;
*p=50;//操作指针方法1
int *p=(int*)malloc(sizeof(int));
*p=50;//操作指针方法2
⑥想更好理解数据结构,要对函数地址传值和指针有一定理解,也要对结构体指针如何操作熟悉
接下来是代码,如有异议或发现错误欢迎指正
#include<iostream>
#include<stdlib.h>
using namespace std;
struct Stack{//定义栈的数据,包括栈的长度和它的栈顶地址
int size;
struct Stack*topaddress;
};
struct ListNode{//栈中的结点,这里用链式结构的链表表示
int data;
struct ListNode*next;
};
void myStack(struct Stack *StackTop){//初始化一个栈
StackTop->size=0;
StackTop->topaddress=NULL;
}
struct ListNode*creatANode(int data){//封装一个创造的新结点
struct ListNode*newnode=(struct ListNode*)malloc(sizeof(struct ListNode));
newnode->data=data;
newnode->next=NULL;
return newnode;
}
void add(struct Stack*myStack,int data){//入栈
struct ListNode*newnode=creatANode(data);
newnode->next = (struct ListNode*)myStack->topaddress;
myStack->topaddress=(struct Stack*)newnode;
myStack->size++;
}
int getTopAddressVal(struct Stack*myStack){//获取栈顶元素
if(myStack->topaddress==NULL){
printf("栈为空,取失败了,接下来函数返回栈的长度0");
return myStack->size;
}
struct ListNode*tem=(struct ListNode*)myStack->topaddress;
return tem->data;
}
void pop(struct Stack*myStack){//弹出栈一个元素
if(myStack->topaddress==NULL){
printf("栈为空,弹出失败");
return;
}
struct ListNode*tem=(struct ListNode*)myStack->topaddress;
tem=tem->next;
myStack->topaddress=(struct Stack*)tem;
myStack->size--;
}
void print(struct Stack*myStack){//打印栈
if(myStack->topaddress==NULL){
printf("栈空,结束");
return ;
}
struct ListNode*head=(struct ListNode*)myStack->topaddress;
while(head){
printf("%d ",head->data);
head=head->next;
}
printf("栈空,结束");
return ;
}
int main(){
struct Stack Stack1;
//struct Stack *S1=&Stack1;
myStack(&Stack1);
add(&Stack1,10);
add(&Stack1,20);
add(&Stack1,30);
add(&Stack1,40);
add(&Stack1,50);
int lookFor;
lookFor=getTopAddressVal(&Stack1);
cout<<"现在栈顶元素是"<<lookFor <<endl;
pop(&Stack1);
lookFor=getTopAddressVal(&Stack1);
cout<<"现在栈顶元素是"<<lookFor <<endl;
print(&Stack1);
return 0;
}