就用這堆函數(shù)就可以了,不懂再追問
平?jīng)鼍W(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,平?jīng)鼍W(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為平?jīng)錾锨в嗉姨峁┢髽I(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個(gè)售后服務(wù)好的平?jīng)鲎鼍W(wǎng)站的公司定做!
#include string.h
#define MaxSize 100
int mystack[MaxSize];/* 第0個(gè)單元保存現(xiàn)在的長度 */
/* 初始化函數(shù) */
void init_stack(int* stack){
memset(stack,0,sizeof(stack));
}
/* 入棧函數(shù) */
void push_back(int* stack,int num){
if(stack[0]MaxSize-1){
++stack[0];
stack[ stack[0] ] = num;
}
else{
printf("ERORR!\n");
}
}
/* 返回棧空間 */
int size(int* stack){
return stack[0];
}
/* 返回棧頂函數(shù) */
int top(int* stack){
if(stack[0]0){
return stack[ stack[0] ];
}
else{
printf("ERORR!\n");
return -1;
}
}
/* 出棧函數(shù) */
void pop(int* stack){
if(stack[0]0){
--stack[0];
}
else{
printf("ERORR!\n");
}
}
//該程序簡單并可正確運(yùn)行,希望kutpbpb的回答能對你有所幫助!
#includestdio.h
#define N 100
typedef struct
{
int value[N];
int base;
int top;
}Sta;
void print()
{
printf("\n菜單:");
printf("\n1.入棧:");
printf("\n2.出棧:");
printf("\n3.退出:");
}
void printS(Sta S)
{
printf("\n請輸出棧中元素:");
for(int i=S.top;i!=S.base;i--)
printf("%d ",S.value[i-1]);
}
void pushS(Sta S,int e)
{
if(S.top==N)
printf("\n棧滿");
else
S.value[S.top++]=e;
}
void popS(Sta S,int e)
{
if(S.top==S.base)
printf("\n???);
else
{
e=S.value[--S.top];
printf("\n請輸出出棧元素: %d",e);
}
}
void main()
{
Sta S;
int e,choose;
S.base=S.top=0;
do{
print();
printf("\n請輸入你的選項(xiàng):");
scanf("%d",choose);
switch(choose)
{
case 1:
printf("\n請輸入入棧元素:");
scanf("%d",e);
pushS(S,e);
printS(S);
break;
case 2:
popS(S,e);
printS(S);
break;
case 3:
default:
break ;
}
if(choose==3)
break;
}while(1);
}
您好:
你是在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)方面的知識吧。
首先呢,你學(xué)習(xí)棧,要了解棧的定義,明白它是怎么一回事,就是去理解他的思想。
最后才去用代碼來體現(xiàn)出來。
棧是先進(jìn)后出,其實(shí)是用代碼控制的,
其實(shí)你要他先進(jìn)先出也可以。
你只要明白他的原理就行。
代碼,你可以理解為跟計(jì)算的一種對話的語言。
不用想的那么復(fù)雜。
就好比說話,你只要知道你要說什么就行(算法),而不用刻意明白要怎么說(語法)。
下面給我出我以前寫的代碼,關(guān)于棧的,順序棧,其實(shí)還有鏈棧。
/*???數(shù)據(jù)結(jié)構(gòu)-棧???*/
/*???異常的細(xì)節(jié)處理還沒弄好*/
#include?iostream
#include?stdlib.h
#include?malloc.h
#define?len_chu_shi?50???//初始空間大小
#define?len_zeng_jia?10??//額外增加空間大小
#define?OK?0???????//正確
#define?OVER?-2?????//
#define?ERROR?-1???//
using?namespace?std;
typedef?int?elem_type;??????????//元素類型
typedef?int?function_type;??????//函數(shù)類型
typedef?struct?zhan
{
elem_type?*top;????//棧頂
elem_type?*base;???//棧底
int?len;???????????//當(dāng)前空間大小
}zhan;????????????????//棧結(jié)構(gòu)
function_type?Init_zhan(zhan?*exam);//初始化棧
function_type?Get_top(zhan?*exam,elem_type?*e);//獲取棧頂元素
function_type?Add_top(zhan?*exam,elem_type?*e);//增加棧頂元素
function_type?Delete_top(zhan?*exam,?elem_type?*e);//刪除棧頂元素
int?main(int?argc,char?*argv[])
{
zhan?*example?=?(zhan?*)malloc(sizeof(zhan));
Init_zhan(example);
return?OK;
}
function_type?Init_zhan(zhan?*exam)
{
exam-base?=?(elem_type?*)malloc(len_chu_shi*sizeof(elem_type));
if(!exam-base)??//分配失敗
exit(OVER);
exam-top?=?exam-base;
exam-len?=?len_chu_shi;
return?OK;
}//--end
function_type?Get_top(zhan?*exam,elem_type?*e)
{
if(!exam-base)
exit(OVER);
*e?=?*(exam-top?-?1);??//不能用自減運(yùn)算符,那樣會改變棧頂指針的值
return?OK;
}//--end
function_type?Add_top(zhan?*exam,elem_type?*e)
{
if(exam-len?=?exam-top?-?exam-base)??//我個(gè)人覺得,如果?已經(jīng)"",就已經(jīng)數(shù)據(jù)溢出了,就應(yīng)該報(bào)錯(cuò)
exam-base?=?(elem_type?*)realloc(exam-base,(exam-len?+?len_zeng_jia)*sizeof(elem_type));
if(!exam-base)??//分配失敗
exit(OVER);
*(exam-top++)?=?*e;???//應(yīng)該是先改變棧頂指針的內(nèi)容,然后棧頂指針再自增
exam-len?+=?len_zeng_jia;
return?OK;
}//--end
function_type?Delete_top(zhan?*exam,?elem_type?*e)
{
if(!exam-base)??//空棧
exit(OVER);
*e?=?*(--exam-top);??//應(yīng)該是棧頂指針先自減,然后獲取棧頂指針的內(nèi)容
return?OK;
}//--end
//順序棧
#includestdio.h
#includestdlib.h
#includemalloc.h
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
typedef int ElemType;
int InitStack(SqStack S) //為棧S分配存儲空間,并置S為空棧
{
int size = STACK_INIT_SIZE;
S.base=(int *)malloc(size*sizeof(ElemType));
if(!S.base)
return 0;
S.top=S.base; //置棧S為空棧
S.stacksize=STACK_INIT_SIZE;
return 1;
}
int GetTop(SqStack S,int e) //若棧不空,則用e返回S的棧頂元素
{
if(S.top==S.base) return 0;
e=*(S.top-1);
return 1;
}
int Push(SqStack S, int e) /*進(jìn)棧函數(shù),將e插入棧S中,并使之成為棧頂元素*/
{ if(S.top-S.base=S.stacksize) /*棧滿,追加存儲空間*/
{
int stackinvrement = STACKINCREMENT;
S.base=(ElemType *) realloc(S.base,(S.stacksize+stackinvrement)*sizeof(ElemType));
if(!S.base)
return 0; /*存儲分配失敗*/
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int Pop(SqStack S,int e)/*出棧函數(shù),若棧S不空,則刪除S的棧頂元素,用e返回其值*/
{ if(S.top==S.base) return 0;
e=*--S.top;
return 1;
}
void OutputStack(SqStack S)
{int *q;
q=S.top-1;
for(int i=0;iS.top-S.base;i++)
{
printf("%3d ",*q);q--;}
}
void main()
{
int a,b,c ;
char m;
SqStack s;
InitStack(s);
printf("請輸入要進(jìn)棧的元素個(gè)數(shù)是:");
scanf("%d",a);
printf("\n請輸入要進(jìn)棧的%d個(gè)元素:",a);
for(b=0;ba;b++) {
scanf("%d",c);
Push(s,c); }
do { printf("\n");
printf("*********** 1.輸出棧的元素**********\n");
printf("*********** 2.取棧頂元素************\n");
printf("*********** 3.刪除棧頂元素**********\n");
printf("*********** 4.退出程序**********\n");
printf("\n請選擇一個(gè)字符:");
getchar();
scanf("%c",m);
switch(m) {
case '1': printf("\n輸出的棧為:");
OutputStack(s);
break;
case '2': GetTop(s,c);
printf("\n棧頂元素為:%d",c);
printf("\n輸出的棧為:");
OutputStack(s);
break;
case '3': Pop(s,c);
printf("\n刪除的棧頂元素:%d",c);
printf("\n輸出的棧為:");
OutputStack(s);
printf("\n");
break;
case '4':break;
default: printf("輸入的數(shù)字有錯(cuò),請重新選擇!\n"); break;
}
}while(m!='4');
}
//鏈棧
#includestdio.h
#includestdlib.h
typedef struct SNode
{
int data;
struct SNode *next;
}SNode,*LinkStack;
LinkStack top;
LinkStack PushStack(LinkStack top,int x) //入棧
{
LinkStack s;
s=(LinkStack)malloc(sizeof(SNode));
s-data=x;
s-next=top;
top=s;
return top;
}
LinkStack PopStack(LinkStack top) //退棧
{
LinkStack p;
if(top!=NULL)
{
p=top;
top=top-next;
free(p);
printf("退棧已完成\n");
return top;
}
else printf("棧是空的,無法退棧!\n"); return 0;
}
int GetStackTop(LinkStack top) //取棧頂元素
{
return top-data;
}
bool IsEmpty()//bool取值false和true,是0和1的區(qū)別,bool只有一個(gè)字節(jié),BOOL為int型,bool為布爾型
{
return top==NULL ? true:false;
}
void Print()
{
SNode *p;
p=top;
if(IsEmpty())
{
printf("The stack is empty!\n");
return;
}
while(p)
{
printf("%d ", p-data);
p=p-next;
}
printf("\n");
}
void main()
{
int x,a,b;
char m;
do { printf("\n");
printf("###############鏈棧的基本操作##################\n");
printf("××××××××1.置空?!痢痢痢痢痢痢痢痢痢羂n");
printf("××××××××2.進(jìn)?!痢痢痢痢痢痢痢痢痢痢羂n");
printf("××××××××3.退棧×××××××××××\n");
printf("××××××××4.取棧頂元素××××××××\n");
printf("××××××××5.退出程序×××××××××\n");
printf("##############################################\n");
printf("\n請選擇一個(gè)字符:");
scanf("%c",m);
switch(m){
case '1':
top=NULL;
printf("\n棧已置空!");
break;
case '2':
printf("\n請輸入要進(jìn)棧的元素個(gè)數(shù)是:");
scanf("%d",a);
printf("\n請輸入要進(jìn)棧的%d個(gè)元素:",a);
for(b=0;ba;b++) {
scanf("%d",x);
top=PushStack(top,x); }
printf("進(jìn)棧已完成!\n");
printf("\n輸出棧為:");
Print();
break;
case '3':
printf("\n操作之前的輸出棧為:");
Print();
top=PopStack(top);
printf("\n操作過后的輸出棧為:");
Print();
break;
case '4':
printf("\n輸出棧為:");
Print();
if(top!=NULL)
printf("\n棧頂元素是:%d\n",GetStackTop(top));
else
printf("\n棧是空的,沒有元素!");
break;
case '5':break;
default:
printf("\n輸入的字符不對,請重新輸入!");
break;
}
getchar();
}while(m!='5');
}
看一個(gè)棧的簡單實(shí)現(xiàn),所有代碼都寫在一個(gè)頭文件中,實(shí)際的話,最好把聲明和實(shí)現(xiàn)分開。
#ifndef STACK_H
#define STACK_H
class Stack
{
public:
Stack();
Stack(const Stack copy);
Stack operator= (const Stack copy);
~Stack();
int getHeight() const;
bool isEmpty();
bool push(const int e);
bool pop(int e);
bool top(int e) const;
private:
int count;
int element[MAX_SIZE];
};
Stack::Stack()
{
count = 0;
}
Stack::Stack(const Stack copy)
{
this-count = copy.count;
for(int i = 0; i copy.count; i++)
{
element[i] = copy.element[i];
}
}
Stack Stack::operator =(const Stack copy)
{
if(copy != this)
{
this-count = copy.count;
for (int i = 0; i copy.count; i++)
{
element[i] = copy.element[i];
}
}
return *this;
}
Stack::~Stack()
{
count = 0;
}
int Stack::getHeight() const
{
return count;
}
bool Stack::isEmpty()
{
return count == 0;
}
bool Stack::push(const int e)
{
if (getHeight() == MAX_SIZE)
{
return false;
}
element[count++] = e;
return true;
}
bool Stack::pop(int e)
{
if (isEmpty() )
{
return false;
}
e = element[count--];
return true;
}
bool Stack::top(int e) const
{
e = element[count - 1];
return true;
}
#endif