#include "stdio.h"
薛城ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
#include "malloc.h"
typedef struct node1{
int *data;
int top;
void init(void);
void del(void);
int pop(int);
void push(int);
}s;
void node1::init(){
data=(int*)malloc(sizeof(int)*100);
top=0;
}
void node1::del(){
free(data);
top=0;
}
int node1::pop(int e){
if(top==0)return 0;
e=data[--top];
return 1;
}
void node1::push(int e){
if(top==100)return;
data[top++]=e;
}
typedef struct node2{
int *data;
int top;
int bottom;
void init(void);
void del(void);
int pop(int);
void push(int);
void format(s);
}q;
void node2::init(){
data=(int*)malloc(sizeof(int)*100);
top=bottom=0;
}
void node2::del(){
free(data);
top=bottom=0;
}
int node2::pop(int e){
if(top==bottom)return 0;
e=data[top++];
return 1;
}
void node2::push(int e){
if(bottom==100)return;
data[bottom++]=e;
}
void node2::format(s e){
int a;
while(e.pop(a)){
push(a);
}
}
int main(){
s b;q c;
int a;
b.init();c.init();
printf("輸入棧中的數(shù),以0結(jié)尾\n");
while(1){
scanf("%d",a);
if(a==0)break;
b.push(a);
}
c.format(b);
while(c.pop(a)){
printf("%d\n",a);
}
b.del();
c.del();
return 0;
}//b為棧,c為隊(duì)列,c.format(b)為轉(zhuǎn)換函數(shù)
棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。其限制是僅允許在表的一端進(jìn)行插入和刪除運(yùn)算。這一端被稱為棧頂,相對(duì)地,把另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧、入?;驂簵?,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個(gè)棧刪除元素又稱作出?;蛲藯#前褩m斣貏h除掉,使其相鄰的元素成為新的棧頂元素。
隊(duì)列是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作,和棧一樣,隊(duì)列是一種操作受限制的線性表。進(jìn)行插入操作的端稱為隊(duì)尾,進(jìn)行刪除操作的端稱為隊(duì)頭。
以上是從數(shù)據(jù)結(jié)構(gòu)角度來看,從操作系統(tǒng)角度來看,所有的數(shù)據(jù)結(jié)構(gòu)都是對(duì)虛擬內(nèi)存的操作,堆是堆,棧是棧,棧指的是C語言函數(shù)所使用的自動(dòng)有函數(shù)回收的虛擬內(nèi)存空間,而堆則有操作系統(tǒng)堆管理器來管理的那部分虛擬內(nèi)存,從C語言角度來看,使用malloc函數(shù)動(dòng)態(tài)分配的內(nèi)存,就是堆內(nèi)存。
給你看下棧的頭文件
你自己添加判斷是否是回文的方法吧
#ifndef STACK_H
#define STACK_H
#include iostream
using std::ostream;
//template class Type
//class Stack;
//template class Type
//ostream operator (ostream , const StackType );
template class Type
class Stack {
friend ostream operator (ostream , const StackType );
public:
static const int DefaultSize;
Stack(int = DefaultSize); //創(chuàng)建一個(gè)最大容量為MaxStackSize的空棧
Stack(Type[], int, int = DefaultSize); //用數(shù)組初始化棧
~Stack(){ delete [] stack; }
bool IsFull(); //若元素個(gè)數(shù)等于棧的最大容量則返回TRUE,否則返回FALSE
void Add(const Type ); //若IsFull()為TRUE,則調(diào)用StackFull,否則將item插入棧頂
bool IsEmpty(); //若棧中元素個(gè)數(shù)等于0則返回TRUE,否則返回FALSE
Type * Delete(Type); //若IsEmpty()為TRUE,則調(diào)用StackEmpty并返回0,
//否則刪除棧頂元素并返回其指針
void StackFull(); //將棧的最大容量擴(kuò)大一倍
void StackEmpty(); //輸出警告:棧已空, 不能彈出變量
void Empty(); //將棧清空
int GetSize(); //獲得棧內(nèi)元素?cái)?shù)目
private:
Type * stack;
int MaxSize;
int top;
};
template class Type
const int StackType::DefaultSize = 10;
template class Type
StackType::Stack(int pMaxSize) {
MaxSize = pMaxSize;
stack = new Type[MaxSize];
top = -1;
}
template class Type
StackType::Stack(Type pArray[], int pLen, int pMaxSize) {
stack = new Type[pMaxSize];
for ( int i = 0; i pLen; i++ )
{
stack[i] = pArray[i];
}
top = pLen - 1;
MaxSize = pMaxSize;
}
template class Type
inline bool StackType::IsFull() {
if (top == MaxSize - 1) return true;
else return false;
}
template class Type
inline bool StackType::IsEmpty() {
if (top == -1) return true;
else return false;
}
template class Type
void StackType::Add(const Type pX) {
if (IsFull())
{
StackFull();
stack[++top] = pX;
}
else stack[++top] = pX;
}
template class Type
Type * StackType::Delete(Type pX) {
if (IsEmpty())
{
StackEmpty();
return 0;
}
pX = stack[top--];
return pX;
}
template class Type
void StackType::StackEmpty() {
cout "棧已空,不能進(jìn)行彈出操作!" endl;
}
template class Type
void StackType::StackFull() {
Type * nStack = new Type[MaxSize * 2];
for ( int i = 0; i = top; i++ )
{
nStack[i] = stack[i];
}
MaxSize = MaxSize * 2;
delete [] stack;
stack = nStack;
cout "棧已滿,棧的自動(dòng)容量自動(dòng)擴(kuò)充為原來的兩倍 (" MaxSize ")" endl;
}
template class Type
ostream operator (ostream pOutput, const StackType pS) {
if (pS.top == -1)
{
pOutput "空棧" endl;
return pOutput;
}
for ( int i = 0; i = pS.top; i++ )
{
pOutput pS.stack[i] " ";
}
return pOutput;
}
template class Type
void StackType::Empty() {
top = -1;
}
template class Type
int StackType::GetSize() {
return top + 1;
}
#endif
棧(Stack)是僅限制在表的一端進(jìn)行插入和刪除運(yùn)算的線性表,稱插入、刪除這一端為棧頂,另一端稱為棧底。表中無元素時(shí)為空棧。棧 的修改是按后進(jìn)先出的原則進(jìn)行的,我們又稱棧為L(zhǎng)IFO表(Last In First Out)。通常棧有順序棧和鏈棧兩種存儲(chǔ)結(jié)構(gòu)。 棧的基本運(yùn)算有六種: ·構(gòu)造空棧:InitStack(S) ·判??? StackEmpty(S) ·判棧滿: StackFull(S) ·進(jìn)棧: Push(S,x) ·退棧: Pop(S) ·取棧頂元素:StackTop(S) 在順序棧中有"上溢"和"下溢"的現(xiàn)象。 ·"上溢"是棧頂指針指出棧的外面是出錯(cuò)狀態(tài)。 ·"下溢"可以表示棧為空棧,因此用來作為控制轉(zhuǎn)移的條件。 順序棧中的基本操作有六種:·構(gòu)造空?!づ袟?铡づ袟M·進(jìn)?!ね藯!とm斣?鏈棧則沒有上溢的限制,因此進(jìn)棧不要判棧滿。鏈棧不需要在頭部附加頭結(jié)點(diǎn),只要有鏈表的頭指針就可以了。 鏈棧中的基本操作有五種:·構(gòu)造空?!づ袟?铡みM(jìn)?!ね藯!とm斣?隊(duì)列(Queue)是一種運(yùn)算受限的線性表,插入在表的一端進(jìn)行,而刪除在表的另一端進(jìn)行,允許刪除的一端稱為隊(duì)頭(front),允許插入的 一端稱為隊(duì)尾(rear) ,隊(duì)列的操作原則是先進(jìn)先出的,又稱作FIFO表(First In First Out) 。隊(duì)列也有順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ)兩種存儲(chǔ)結(jié) 構(gòu)。 隊(duì)列的基本運(yùn)算有六種: ·置空隊(duì):InitQueue(Q) ·判隊(duì)空:QueueEmpty(Q) ·判隊(duì)滿:QueueFull(Q) ·入隊(duì):EnQueue(Q,x) ·出隊(duì):DeQueue(Q) ·取隊(duì)頭元素:QueueFront(Q) 順序隊(duì)列的"假上溢"現(xiàn)象:由于頭尾指針不斷前移,超出向量空間。這時(shí)整個(gè)向量空間及隊(duì)列是空的卻產(chǎn)生了"上溢"現(xiàn)象。 為了克服"假上溢"現(xiàn)象引入循環(huán)向量的概念,是把向量空間形成一個(gè)頭尾相接的環(huán)形,這時(shí)隊(duì)列稱循環(huán)隊(duì)列。 判定循環(huán)隊(duì)列是空還是滿,方法有三種: ·一種是另設(shè)一個(gè)布爾變量來判斷; ·第二種是少用一個(gè)元素空間,入隊(duì)時(shí)先測(cè)試((rear+1)%m = front)? 滿:空; ·第三種就是用一個(gè)計(jì)數(shù)器記錄隊(duì)列中的元素的總數(shù)。 隊(duì)列的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)稱為鏈隊(duì)列,一個(gè)鏈隊(duì)列就是一個(gè)操作受限的單鏈表。為了便于在表尾進(jìn)行插入(入隊(duì))的操作,在表尾增加一個(gè)尾指 針,一個(gè)鏈隊(duì)列就由一個(gè)頭指針和一個(gè)尾指針唯一地確定。鏈隊(duì)列不存在隊(duì)滿和上溢的問題。在鏈隊(duì)列的出隊(duì)算法中,要注意當(dāng)原隊(duì)中只 有一個(gè)結(jié)點(diǎn)時(shí),出隊(duì)后要同進(jìn)修改頭尾指針并使隊(duì)列變空。
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define N 20
typedef char SElemType;
typedef int Status;typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;#includestdio.h
#includestdlib.hStatus CreatStack(SqStack S){
//創(chuàng)建棧
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//CreatStackStatus Push(SqStack S,SElemType e){
//插入e為新的棧頂元素
if(S.top-S.base=S.stacksize){//棧滿,追加存儲(chǔ)空間
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)exit (OVERFLOW);//存儲(chǔ)空間分配失敗
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//PushStatus Pop(SqStack S ,SElemType e){
//若棧不空,刪除棧頂元素,并用e返回其值
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}//Pop typedef char QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QNodePtr;typedef struct{
QNodePtr front;
QNodePtr rear;
}LinkQueue;Status CreatQueue(LinkQueue Q){
//建立一個(gè)空的鏈?zhǔn)綏?/p>
Q.front=Q.rear=(QNodePtr)malloc(sizeof(QNode));
if(!Q.front)exit(OVERFLOW);
Q.front-next=NULL;
return OK;
}Status EnQueue(LinkQueue Q,QElemType e){ QNodePtr p;
p=(QNodePtr)malloc(sizeof(QNode));
if(!p)exit(OVERFLOW);
p-data=e;p-next=NULL;
Q.rear-next=p;
Q.rear=p;
return OK;
}Status DeQueue(LinkQueue Q,QElemType e){QNodePtr p;brif(Q.front==Q.rear) return ERROR;brp=Q.front-next; e=p-data;brQ.front-next=p-next;brif(Q.rear==p) Q.rear=Q.front;brfree(p);brreturn OK;br}int stackPalindrom_Test()//判別輸入的字符串是否回文序列,是則返回1,否則返回0
{
printf("棧練習(xí),請(qǐng)輸入要判斷的字符串以#作為結(jié)束符,不要超過二十個(gè)字符\n");
SqStack S;
CreatStack(S);
char c;
SElemType a;
SElemType b[N];
int count = 0;
fgets( b, N, stdin );
while((b[count])!='#')
{
Push(S,b[count]); //進(jìn)棧
count++;
}
int i = 0;
while(i count)
{
Pop(S,a);
if(a!=b[i])
return ERROR;
i++;
}
return OK;}//stackPalindrom_Test int queuePalindrom_Test()//判別輸入的字符串是否回文序列,是則返回1,否則返回0
{
printf("隊(duì)列練習(xí),請(qǐng)輸入要判斷的字符串以#作為結(jié)束符,不要超過二十個(gè)字符\n");
LinkQueue Q;
CreatQueue(Q); char c;
SElemType a;
SElemType b[N];
int count = 0;
fgets( b, N, stdin );
while((b[count])!='#')
{
EnQueue(Q,b[count]);; //入列
count++;
} while(count-- 0)
{
DeQueue(Q,a);
if(a!=b[count])
return ERROR;
}
return OK;
}//queuePalindrom_Test Status main(){ if(stackPalindrom_Test()==1)
printf("是回文\n");
else printf("不是回文\n"); if(queuePalindrom_Test()==1)
printf("是回文\n");
else printf("不是回文\n");
return OK;
}
本文標(biāo)題:c語言用棧隊(duì)列函數(shù) 用棧實(shí)現(xiàn)隊(duì)列c語言
鏈接分享:http://muchs.cn/article40/hjeceo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、品牌網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、云服務(wù)器、ChatGPT、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)