資料結構 最小棧的兩種實現方法

2021-08-15 02:50:28 字數 4422 閱讀 6719

一切都在注釋裡~

seqstcak.h

#pragma once

#include#includetypedef char seqtype;

#define seqdatamax 1000

/*建立乙個棧的結構體*/

typedef struct seqstackseqstack;

/*初始化棧*/

void seqstackinit(seqstack* seq);

/*從棧裡面壓入乙個元素*/

void seqstackpush(seqstack* seq, seqtype value);

/*出棧乙個元素*/

void seqstackpop(seqstack* seq);

/*取棧底元素*/

seqtype seqstacktopvalue(seqstack* seq);

/*銷毀棧*/

void seqstackdestory(seqstack* seq);

/*列印棧*/

void printchar(seqstack* seq, char* msg);

/** 最小棧

* 方法一:建立乙個輔助棧,

* 每次入棧之前,把棧頂元素和輔助棧的棧頂元素比較

* 如果小於等於輔助棧棧頂元素,則入棧輔助棧

* 出棧時,把出棧的元素和輔助棧棧頂元素比較,

* 如果小於等於輔助棧棧頂元素,則把輔助棧棧頂元素也出棧

* 方法二:每次壓棧的時候

* 把入棧元素和當前最小值一比較,然後把最小值也壓入棧

* 空棧的時候,就把當前元素壓兩次,棧頂元素為最小值

* 出棧時,一次出兩個元素

*//*方法一*/

void seqstackmin1(seqstack* seq, seqstack* seq2, int flag, int value);

/*可以求出最小元素的push*/

void seqstackpush2(seqstack* seq1, seqstack* seq2, seqtype value);

/*pop*/

void seqstackpop2(seqstack* seq1, seqstack*seq2);

/*方法二*/

/*入棧乙個元素*/

void seqstackpush3(seqstack* seq, seqtype value);

/*出棧乙個元素*/

void seqstackpop3(seqstack* seq);

/*取棧頂元素*/

seqtype seqstackgettop(seqstack* seq);

seqstcak.c

#define _crt_secure_no_warnings 1

#include"seqstack.h"

/*初始化棧*/

void seqstackinit(seqstack* seq)

seq->top = seq->data[0];

seq->bottom = seq->top;

seq->size = 0;

}/*從棧裡面壓入乙個元素*/

void seqstackpush(seqstack* seq, seqtype value)

/*判斷棧是不是已經滿了*/

if (seq->size == seqdatamax - 1)

seq->data[seq->size] = value;

seq->size++;

}/*刪除棧頂元素,出棧乙個元素*/

void seqstackpop(seqstack* seq)

/*判斷棧是否為空棧*/

if (seq->size == 0)

seq->size--;

}/*取棧頂元素*/

seqtype seqstacktopvalue(seqstack* seq)

int sz = seq->size - 1;

seqtype tmp = seq->data[sz];

return tmp;

}/*銷毀棧*/

void seqstackdestory(seqstack* seq)

seq->size = 0;

seq->top = seq->data[0];

}/*列印棧*/

void printchar(seqstack* seq, char* msg)

printf("%s\n\n", msg);

printf("[top]->");

int i = 0;

int sz = seq->size;

for (; i < sz; i++)

printf("<-[bottom]\n\n");

seq->size = sz;

}void seqstackmin1(seqstack* seq, seqstack* seq2, int flag, int value)

/*比較當前元素和輔助棧棧頂元素的大小

*如果大與輔助棧棧頂元素,則不理會

*反之則需要壓入輔助棧

*/else

else

} }//當前操作為出棧

else if (flag == 0)

else }}

void seqstackpush2(seqstack* seq1, seqstack* seq2, seqtype value)

if (seq2 == null)

if (seq1->size == seqdatamax)

seq1->data[seq1->size] = value;

seq1->size++;

seqstackmin1(seq1, seq2, 1, value);

}void seqstackpop2(seqstack* seq1, seqstack*seq2)

if (seq2 == null)

/*出棧得先判斷, 再出棧*/

seqtype tmp = seqstacktopvalue(seq1);

seqstackmin1(seq1, seq2, 0, tmp);

/*然後出棧*/

seq1->size--;

if (seq1->size == 0)

}/*入棧乙個元素*/

void seqstackpush3(seqstack* seq, seqtype value)

/*判斷空棧*/

if (seq->size == 0)

/* * 不是空棧

* 取出棧頂元素,與當前元素比較

* 如果當前元素大於已知最小元素,則壓棧時,把當前元素入棧,再把最小元素入棧

* 如果當前元素小於已知最小元素,則把當前元素入棧兩次

*/ //取出棧頂元素

seqtype tmp = seqstacktopvalue(seq);

/*把當前元素入棧,再把最小元素入棧,即tmp*/

if (value > tmp)

else

}/*出棧乙個元素*/

void seqstackpop3(seqstack* seq)

if (seq->size == 0)

/*因為每次都壓入兩個元素,所以出棧也要出棧兩個元素*/

seqstackpop(seq);

seqstackpop(seq);

}/*取棧頂元素*/

seqtype seqstackgettop(seqstack* seq)

/*棧頂元素是最小值*/

seqtype min = seqstacktopvalue(seq);

seqstackpop(seq);

seqtype top_value = seqstacktopvalue(seq);

/*再把最小值重新入棧*/

seqstackpush(seq, min);

return top_value;

}

test.h

#define _crt_secure_no_warnings 1

#include#include#include"seqstack.h"

#define tesehead printf("------------------%s----------------\n",__function__)

void testpush()

void testpop()

void testgettop()

void testminvalue1()

void testminvalue2()

int main()

資料結構學習之棧的兩種實現方式

棧的實現 對空棧的pop和對滿push都是越界異常 兩種實現方式 表實現 陣列實現 1。表實現 棧adt鍊錶實現的型別宣告 ifndef stack h struct node typedef struct node ptrtonode typedef ptrtonode stack int ise...

棧的兩種實現

順序表實現棧 include include 順序表實現棧 define test head printf n s n function define default sz 5 typedef char datatype typedef struct seqstack seqstack 棧的初始化 ...

棧的兩種實現

棧的基本實現 include stdafx.h include include define maxsize 64 using namespace std 基於陣列實現的棧 class stack 預設建構函式 int push int data 元素入棧 int pop 元素出棧 bool ise...