#include?stdio.h
10年積累的成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有永興免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
#include?conio.h
#include?stdlib.h
#define?elemType?int /*?鏈棧元素?cái)?shù)據(jù)類型?*/
#define?SNODE_SIZE?sizeof?(struct?sNode) /*?鏈棧結(jié)點(diǎn)空間大小?*/
#define?status?int /*?狀態(tài)型變量?*/
#define?OVERFLOW?-1 /*?內(nèi)存溢出狀態(tài)碼?*/
#define?ERROR?0 /*?錯(cuò)誤狀態(tài)碼?*/
#define?OK?1 /*?正確狀態(tài)碼?*/
/*?鏈棧結(jié)點(diǎn)存儲(chǔ)結(jié)構(gòu)?*/
typedef?struct?sNode?{
elemType?data;
struct?sNode?*next;
}?sNode,?*sNodePtr;
/*?鏈棧存儲(chǔ)結(jié)構(gòu)?*/
typedef?struct?linkStack?{
sNodePtr?top;?/*?棧頂指針?*/
}?linkStack;
/*?初始化?*/
/*?操作結(jié)果:構(gòu)造一個(gè)帶頭結(jié)點(diǎn)的空鏈棧S?*/
void?initStack?(linkStack?*S)?{
S-top?=?(sNodePtr)?malloc?(SNODE_SIZE);?/*?產(chǎn)生頭結(jié)點(diǎn),棧頂指針指向此頭結(jié)點(diǎn)?*/
if?(!S-top)?/*?內(nèi)存分配失敗?*/
exit?(OVERFLOW);
S-top-next?=?NULL;
}
/*?銷毀?*/
/*?初始條件:鏈棧S已存在。操作結(jié)果:銷毀鏈棧S?*/
void?destroyStack?(linkStack?*S)?{
sNodePtr?p,?q;
p?=?S-top;?/*?p指向S的頭結(jié)點(diǎn)?*/
while?(p)?{
q?=?p-next;?/*?q指向p的下一個(gè)結(jié)點(diǎn)?*/
free?(p);?/*?回收p指向的結(jié)點(diǎn)?*/
p?=?q;?/*?p移動(dòng)到下一個(gè)結(jié)點(diǎn)?*/
}?/*?直到?jīng)]有下一個(gè)結(jié)點(diǎn)?*/
}
/*?判斷鏈棧是否為空?*/
/*?初始條件:鏈棧S已存在。操作結(jié)果:若S為空鏈棧,則返回TRUE,否則返回FALSE?*/
status?stackIsEmpty?(linkStack?*S)?{
return?S-top-next?==?NULL;
}
/*?入棧?*/
/*?操作結(jié)果:在S的棧頂插入新的元素e?*/
status?push?(linkStack?*S,?elemType?e)?{
sNodePtr?p;
p?=?(sNodePtr)?malloc?(SNODE_SIZE);?/*?產(chǎn)生新結(jié)點(diǎn)?*/
if?(!p)?/*?內(nèi)存分配失敗?*/
exit?(OVERFLOW);
p-data?=?e;
p-next?=?S-top-next;?/*?將新結(jié)點(diǎn)鏈接到原棧頂?*/
S-top-next?=?p;?/*?棧頂指向新結(jié)點(diǎn)?*/
}
/*?出棧?*/
/*?操作結(jié)果:刪除S的棧頂元素,并由e返回其值?*/
status?pop?(linkStack?*S,?elemType?*e)?{
sNodePtr?p;
if?(stackIsEmpty?(S))
return?ERROR;
p?=?S-top-next;?/*?p指向鏈棧的第一個(gè)結(jié)點(diǎn)?*/
*e?=?p-data;?/*?取出數(shù)據(jù)?*/
S-top-next?=?p-next;
free?(p);?/*?刪除該結(jié)點(diǎn)?*/
if?(S-top?==?p)?/*?棧為空?*/
S-top-next?=?NULL;
return?OK;
}
/*?打印棧內(nèi)容?*/
/*?初始條件:鏈棧S已存在。操作結(jié)果:當(dāng)棧不為空時(shí),打印棧內(nèi)容并返回OK,否則返回ERROR?*/
status?printStack?(linkStack?*S)?{
sNodePtr?p;
if?(stackIsEmpty?(S))?{
puts?("The?stack?is?empty!?");
return?ERROR;
}
p?=?S-top-next;
while?(p)?{
printf?("%d\t",?p-data);
p?=?p-next;
}
putchar?('\n');
return?OK;
}
int?main?(void)?{
linkStack?S;
elemType?e;?
elemType?a,?b,?c,?d;
a?=?1;?b?=?2;?c?=?3;?d?=?4;
initStack?(S);
push?(S,?a);
push?(S,?b);
push?(S,?c);
push?(S,?d);
puts?("Push?4?elements");
printf?("S:\t");
printStack?(S);
putchar?('\n');
pop?(S,?e);
puts?("Pop?1?element");
printf?("S:\t");
printStack?(S);
destroyStack?(S);
getch?();?/*?屏幕暫留?*/
return?0;
}
如有問題,可以點(diǎn)擊頭像聯(lián)系我
Pop函數(shù)改成這樣:
int Pop (Stack * pstack, int * pname)
{
if(pstack-top=0)
{
return 0;
}
pstack-top--;
* pname = pstack-data[pstack-top];
return 1;
}
Push函數(shù)改成這樣:
int Push (Stack * pstack, int num)
{
if(pstack-top=Stack_size)
{
printf("Push Error!");
return 0;
}
pstack-data[pstack-top]=num;
pstack-top++;
return 0;
}
試試(原來(lái)那樣當(dāng)元素達(dá)到最大數(shù)目時(shí)pstack-top就越界了)。
#include?stdio.h
#include?stdlib.h
#define?MAXSIZE?32
typedef?struct{
int?*elem;/*?棧的存儲(chǔ)區(qū)?*/
??int?max;???/*?棧的容量,即找中最多能存放的元素個(gè)數(shù)?*/
??int?top;???/*?棧頂指針?*/?
}Stack;
int?InitStack(Stack?*S,?int?n)?/*創(chuàng)建容量為n的空棧*/
{
S-elem?=?(int?*)malloc(n?*?sizeof(int));
if(S-elem==NULL)?return?-1;
S-max=n;
S-top?=0;?//棧頂初值0
return?0;
}
int?Push(Stack?*S,?int?item)?/*將整數(shù)item壓入棧頂*/
{
if(S-top==S-max)?{
printf("Stack?is?full!?\n");
return?-1;
}
S-elem[S-top++]?=?item;?//壓棧,棧頂加1
return?0;
}
int?StackEmpty(Stack?S)
{
return?(!S.top)?1:0;?/*判斷棧是否為空*/
}
int?Pop(Stack?*S)?/*棧頂元素出棧*/
{
if(!S-top)?{
printf("Pop?an?empty?stack!\n");
return?-1;
}
return?S-elem[--S-top]??;?//彈出棧,棧頂減1
}
void?MultibaseOutput(long?n,int?B)
{
int?m;?Stack?S;
if(InitStack(S,MAXSIZE)){
printf("Failure!\n");
return;
}
do?{
if?(Push(S,B?))?//------
{
printf("Failure!\n");
return;
}
n=?n-1?;?//--------
}while(n!=0);
while(!StackEmpty(S))?{?/*輸出B進(jìn)制的數(shù)*/
m=Pop(S);
if(m10)?printf("%d",m);?/*小于10,輸出數(shù)字*/
else?printf("%c",?m+55);?/*大于或等于10,輸出相應(yīng)的字符*/
}
printf("\n");
}