1. 程式人生 > >9.考研-資料結構-鏈棧的基本操作(帶頭結點)

9.考研-資料結構-鏈棧的基本操作(帶頭結點)

// ConsoleApplication1.cpp : 定義控制檯應用程式的入口點。
//
/*
鏈棧:
兩個特殊狀態:
1.棧空的狀態:lst.next=NULL
2.棧滿的狀態 可以認為無限大
兩個操作:
1.入棧:(頭插法建立連結串列插入操作)
p->next=lst->next;
lst->next=p;
2.出棧(就是單鏈表的刪除操作)
p=lst->next;
x=p->data;
lst->next=p->next;
free(p);
*/
#include "stdafx.h"
#include<iostream>
using namespace std;
//鏈棧的結點定義
typedef struct Lnode{
	int data;
	struct Lnode *next;
}Lnode,*Stack;

//1.初始化一個鏈棧
void initStack(Stack stack) {//stack會改變,用引用型
	stack = (Lnode*)malloc(sizeof(Lnode));//製造一個新的頭結點
	stack->next = NULL;
}
//2.判斷棧空的程式碼
int isEmpty(Stack stack) {
	if (stack->next==NULL) {
		return 1;
	}
	else {
		return  0;
	}
}
//3.進棧的程式碼
void push(Stack stack ,int x) {
	Stack p;
	p = (Lnode*)malloc(sizeof(Lnode));//為進棧元素申請空間
	p->next = NULL;//這一句可以不寫,但是為了良好的程式碼習慣,建議加上
	/* 以下三句就是單鏈表的頭插法 */
	p->data = x;
	p->next = stack->next;
	stack->next = p;//讓頭結點重新指向新加入的元素
}
//4.出棧的程式碼
int pop(Stack stack) {
	Stack p;
	int x;
	if (stack->next==NULL) {
		return 0;
	}
	/*以下就是單鏈表的刪除操作*/
	p = stack->next;
	x = p->data;
	stack->next = p->next;
	//free(p);
	return x;
}




int main()
{
	Stack stack=(Lnode*)malloc(sizeof(Lnode));//製造一個新的頭結點
	stack->next = NULL;
	//初始化一個鏈棧
	//initStack(stack);
	push(stack, 1);
	push(stack, 2);
	int ans = pop(stack);
	cout << ans << endl;
	int ans2 = pop(stack);
	cout << ans2 << endl;

	int f;
	cin >> f;
    return 0;
}