栈代表一种先进后出的存储方式,在实际应用中,基本上有回退操作的都需要运用到栈。
一个栈需要实现的基本操作有:入栈 出栈和标记栈顶元素。 由于这种先进后出的存储结构和链表的头插法非常的相似,所以我们可以借鉴头插法写出一个链式栈。
以下是链式栈的具体代码(通过结构体再封装实现)
#include<stdio.h>
#include <stdlib.h>
//栈:先进后出。 所有关于回退问题的都需要用到栈。
/*栈的基本操作:入栈
出栈
标记栈顶元素
由于栈是先进后出 ,类似于链表的头插法,所以可以使用链式结构来实现*/
typedef struct _Node{ //栈中存放_Node类型的数据
int data;
struct _Node* next;
}Node;
typedef struct _Stack{
int stackSize; //表示栈中元素的个数
Node* stackTop; //Node类型指针 指向栈顶元素
}stack;
Node* createNode(int data){ //新建节点
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
stack* createStack(){ //初始化一个栈
stack* pStack = (stack*)malloc(sizeof(stack));
pStack->stackSize = 0;
pStack->stackTop = NULL;
return pStack;
}
int isEmpty(stack* pstack){ //判断栈是否为空
if (pstack->stackSize)
return 1;
else
return 0;
}
int stackSize(stack* pstack){ //求栈长度
return pstack->stackSize;
}
void putStack(stack* pstack, int data){ //入栈
Node* newNode = createNode(data);
newNode->next = pstack->stackTop;
pstack->stackTop = newNode;
pstack->stackSize++;
}
void outStack(stack* pstack){ //出栈
Node* tempNode = pstack->stackTop;
pstack->stackTop = pstack->stackTop->next;
free(tempNode);
tempNode = NULL;
pstack->stackSize--;
}
void printStack(stack* pstack){ //打印栈中元素
while (pstack->stackSize != 0){
printf("%d ", pstack->stackTop->data);
pstack->stackTop = pstack->stackTop->next;
}
}
int main(){
stack *pstack = createStack();
putStack(pstack, 10);
putStack(pstack, 20);
putStack(pstack, 30);
outStack(pstack);
printStack(pstack);
return 0;
}
下面是二级指针封装的链式栈
#include<stdio.h>
#include<stdlib.h>
typedef struct _stackNode{
int data;
struct _Node* next;
}stackNode;
stackNode* createStack(int data){
stackNode* newNode = (stackNode*)malloc(sizeof(stackNode));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void pushStackNode(stackNode** pstackNode, int data){
stackNode* newNode = createStack(data);
newNode->next = (*pstackNode);
*pstackNode = newNode;
}
void outStackNode(stackNode** pstackNode){
if (pstackNode == NULL){
printf("栈为空,无法输出!\n");
}
else{
stackNode* tempNode = *pstackNode;
*pstackNode = (*pstackNode)->next;
free(tempNode);
tempNode = NULL;
}
}
void printStack(stackNode* pstackNode){
stackNode* pMoveNode = pstackNode;
while (pMoveNode != NULL){
printf("%d ", pMoveNode->data);
pMoveNode = pMoveNode->next;
}
printf("\n");
}
int main(){
stackNode* pstackNode = NULL;
pstackNode=createStack(10);
pushStackNode(&pstackNode,20);
pushStackNode(&pstackNode, 30);
pushStackNode(&pstackNode, 40);
outStackNode(&pstackNode);
printStack(pstackNode);
pushStackNode(&pstackNode, 1000);
printStack(pstackNode);
}