當前位置:首頁 » 格式模板 » c棧模板

c棧模板

發布時間: 2021-03-08 16:19:37

① 求一個c語言標准 棧 的 模板 滿意再給分

#include<stdio.h>
#include<stdlib.h>
/*定義常量*/
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define null 0
#define INFEASIBLE -1
#define OVERFLOW -2

/*定義棧初始分配空間及增量*/
#define initSize 100
#define increment 10
typedef int SElemType;
typedef int Status;

/*定義順序棧類型*/
typedef struct Stack{
SElemType *base;/*棧構造前和銷毀後棧底base為null*/
SElemType *top;/*棧頂指針*/
int stackSize;/*以元素為單位分配當前存儲空間*/
}Stack;

Status initStack(Stack *S){/*初始化一個空棧並將其返回*/
(*S).base=(SElemType *)malloc(initSize*sizeof(SElemType));
if(!(*S).base) exit(OVERFLOW);
(*S).top=(*S).base;
(*S).stackSize=initSize;
return OK;
}

Status destroyStack(Stack *S){/*銷毀棧*/
free((*S).base);
(*S).base=NULL;
(*S).top=NULL;
(*S).stackSize=0;
return OK;
}

Status clearStack(Stack *S){/*清空棧*/
(*S).top=(*S).base;
return OK;
}

Status stackEmpty(Stack S){/*判斷棧是否為空*/
return (S.top==S.base);
}

int stackLength(Stack S){ /*用return返回站棧的長度*/
return S.top-S.base;
}
/**************/
Status getTop(Stack S,SElemType *e){
/*用*e以返回棧頂元素至e */
if(S.top>S.base){
*e=*(S.top-1);
return OK;
}
else return ERROR;
}

Status push(Stack *S,SElemType e){
/*將e入棧以成為新棧頂,並將棧返回*/
if((*S).top-(*S).base>=(*S).stackSize){
/*棧滿,追加空間*/
(*S).base=(SElemType *)realloc((*S).base,((*S).stackSize+increment)*sizeof(SElemType));
if(!(*S).base) exit(OVERFLOW);
(*S).top=(*S).base+(*S).stackSize;
(*S).stackSize+=increment;
}
*((*S).top)++=e; /*從右向左運算,即:(*S) (*S).top++ 它指向的元素 */
return OK;
}

Status pop(Stack *S,SElemType *e){
/*彈出棧頂,用*e返回其值至e,並將棧返回*/
if((*S).top==(*S).base) return ERROR;
*e=*--(*S).top;
return OK;
}

Status stackTraverse(Stack S,Status(*visit)(SElemType)){
/*遍歷元素執行函數visit*/
while(S.top>S.base)
visit(*S.base++);
printf("\n");
return OK;
}

接下來要添加自己的main()方法

② c語言寫一個數組棧

#include<stdio.h>
#include<stdlib.h>
#defineSize20

typedefcharElementType;
typedefstruct
{
ElementTypedata[Size];
inttop;
}Stack;

intStackFull(Stack*s)
{
return(s->top==Size-1);
}

voidPushStack(Stack*s,char*buf)
{
if(NULL==s||NULL==buf)
return;
while(*buf!=''&&*buf!='^'&&!StackFull(s))
{
if(*buf!='')
s->data[++s->top]=*buf;
++buf;
}
}

voidPopStack(Stack*s)
{
if(NULL==s)
return;
while(s->top!=-1)
putchar(s->data[s->top--]);
}

intmain()
{
charstr[Size];
Stack*s=(Stack*)malloc(sizeof(Stack));
s->top=-1;

gets(str);
PushStack(s,str);
PopStack(s);

return0;
}

③ 建立一個堆棧類模板 C++

寫完再來貼
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
我覺得鏈棧沒必要初始化,構造函數已經夠了,更不必判棧滿,所以就沒寫。
若非要的話,發信給我,再幫你寫一個初始化函數
template<class T>
class Stack{
class X{
public:
T e;
X *next;
};
X *base,*top;
public:
Stack();
~Stack();
// void inti();
void Push(T &);
T Pop();
int Empty();
T getTop();
};
template<class T>
Stack<T>::Stack(){
top=base=NULL;
}
template<class T>
Stack<T>::~Stack(){
X *p,*q;
p=top;
if(!p) return;
while(p!=base){
q=p;
p=p->next;
delete q;
}
delete base;
}
template<class T>
T Stack<T>::Pop(){
if(top==NULL){
cout<<"棧已空!\n";
return (T)0;
}
else{
X *p;
p=top;
top=top->next;
T t=p->e;
delete p;
return t;
}
}
template<class T>
T Stack<T>::getTop(){
if(top==NULL){
cout<<"棧已空!\n";
return (T)0;
}
else{
return top->e;
}
}
template<class T>
void Stack<T>::Push(T &t){
if(top==NULL){
top=base=new X;
top->e=t;
top->next=NULL;
}
else{
X *p;
p=new X;
p->e=t;
p->next=top;
top=p;
}
}
template<class T>
int Stack<T>::Empty(){
return(top==NULL)?1:0;
}
void main(){
Stack<int> s;
int i;
for(i=15;i<30;i++){
s.Push(i);
}

while(!s.Empty()){
cout<<s.Pop()<<endl;
}
Stack<float> sf;
for(i=1;i<10;i++){
float t=1.0/i;
sf.Push(t);
}
cout<<sf.getTop();
sf.Pop();
cout<<sf.getTop()<<endl;
while(!sf.Empty()) cout<<sf.Pop()<<endl;

}

④ c++中用類模板來定義順序棧類

#include <iostream>
using namespace std;

template <class T>
class stack {
public:
stack(T n)
: base(new T[n]), sp(base), size(0), capacity(n)
{ }

T push(T n) {
*sp++ = n;
++size;
return n;
}
T pop() {
return *--sp;
}

void mp() const {
for(T* p = base; p != sp; ++p)
cout << *p << ' ';
cout.put('\n');
}

bool empty() const {
return sp == base;
}

~stack() {
if(capacity != 0)
delete [] base;
}
private:
T* base;
T* sp;
int size;
const int capacity;
};

#define PUSH( s, a, b ) for( i = 0; i < b; ++i ) s.push( a+i );
#define POP( a ) while( !a.empty() ) cout << a.pop() << ' '; cout.put( '\n' );
int main()
{
stack<int> a(10);
stack<char> b(10);
stack<double> c(10);
int i;
PUSH( a, 1, 3 );
PUSH( b, 'a', 5 );
PUSH( c, 1.1, 8 );
a.mp(); b.mp(); c.mp();
POP( a ); POP( b ); POP( c );
return 0;
}

附圖:

⑤ C++ 求一個堆棧類模板

就是這個了,望採納。#ifndef STACK_H#define STACK_Husing namespace std;template<class elemtype>class stack{ public: stack(){head=NULL; n=0;} virtual ~stack(){head=NULL;} int length(){return n;} bool push(elemtype& );//入棧 elemtype pop();//出棧 bool empty(){return head==NULL;} void clear(); protected: int n; struct node{ node *next; elemtype data; }; node *head;};template<class elemtype>void stack<elemtype>::clear(){ node *p,*q; int i=1; p=head; while(i!=n) { q=p; delete q; p=p->next; i++; }}template<class elemtype>bool stack<elemtype>::push(elemtype &e){ node *p,*q; int j=1; if(head==NULL) head=new node; p=head; if(n==0)//表頭賦值 {head->data=e; n++; return true;} else //表尾插入 { q=new node; q->data=e; while (j<n) { p=p->next; j++; } p->next=q; q->next=NULL; n++; return true;}
}template<class elemtype>elemtype stack<elemtype>::pop( ){ int j=1; node *p; p=head; while(j<n){ p=p->next; j++; } n--; return p->data;}
#endif // stack_H

⑥ C++裡面模板,棧分別是干什麼用的

模板: 為了實現同制邏輯下不同參數類型的演算法
運算符重載 不會改變運算符的優先順序和結合型
如 void operator+(int x,int y);
int a = b+c;
+號重載的時候要這么用 X + X ,不會改變結合性.所有有些感覺比原來的操作少一個參數.

⑦ 用C++語言寫一個實現棧功能的模板類 包括pop push 功能

#include <iostream.h>
#include <stdlib.h>
/////////////////////////////////////////////////////////////////////////////////////

#define MAXSIZE 0xFFFF

template<class type>
class SeqStack
{
int top; //棧頂指示
type *stacka; //數組名
int maxsize; //棧最大可容納元素個數
public:
SeqStack();
SeqStack(int size);
SeqStack(type data[],int size);
virtual ~SeqStack()
{
delete []stacka;
}
void Push(const type &item); //元素item壓棧
type Pop(); //數據元素出棧,返回之
type GetTop(); //讀棧頂數據元素並返回

int Empty()const
{
return top==-1;
} //判斷棧是否為空
int Full()const
{
return top==maxsize-1;
} //判斷棧是否為滿
void Clear()
{
top=-1;
} //清空棧
};

template<class type>
SeqStack<type>::SeqStack():
top(-1),maxsize(MAXSIZE)
{
stacka=new type[maxsize];
if(stacka==NULL){
cerr<<"動態存儲分配失敗!"<<endl;
exit(1);
}
}
template<class type>
SeqStack<type>::SeqStack(int size):
top(-1),maxsize(size)
{
stacka=new type[maxsize]; //創建存儲棧的數組
if(stacka==NULL){ //分配不成功
cerr<<"動態存儲分配失敗!"<<endl;
exit(1);
}
}
template<class type>
SeqStack<type>::SeqStack(type data[],int size):
top(-1),maxsize(size)
{
stacka=new type[maxsize]; //創建存儲棧的數組
if(stacka==NULL){ //分配不成功
cerr<<"動態存儲分配失敗!"<<endl;
exit(1);
}
for(int i=0;i<maxsize;i++){
stacka[i]=data[i];
}

top+=maxsize;
}

template<class type>
void SeqStack<type>::Push(const type& item)
{
//若棧已滿,出錯處理;否則把元素item壓棧
if(Full()){
cerr<<"棧已滿,不能壓棧!"<<endl;
exit(1);
}
//這里我們採用指針先移動,然後再對元素進行操作的方式
top++;

stacka[top]=item;
}

template<class type>
type SeqStack<type>::Pop()
{
if(Empty()){
cerr<<"棧已空!"<<endl;
exit(1);
}
//棧不空,取棧頂元素
type data=stacka[top];
top--;
//返回棧頂元素
return data;
}

template<class type>
type SeqStack<type>::GetTop()
{
//若棧不空,返回棧頂元素的值
if(Empty()){
cerr<<"棧空!"<<endl;
exit(1);
}
//返回棧頂元素的值
return stacka[top];
}

//////////////////////////////////////////////////////////////////////

#include "SeqStack.h"
int main()
{
int data[10]={1,2,3,4,5,6,7,8,9,10};
SeqStack<int> stack(data,10);
while(!stack.Empty()){
cout<<stack.Pop()<<" ";
}
cout<<endl;
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////
輸出結果:
10 9 8 7 6 5 4 3 2 1
Press any key to continue
/////////////////////////////////////////////////////////////////////////////////////////

⑧ 用C++語言編寫一個棧的類模板希望能夠把要求的都實現出來謝謝。不好意識沒財富了哪位好心幫寫下下回補上。

template<class T>
class Stack {
public:
Stack(int size) : length(size), tos(0) { stack = new T[length]; }//用戶提供棧長進行初始化
~Stack() { delete [] stack; }
void push(T data) {stack[tos++] = data; } //入棧
T pop() { return stack[--tos]; } //出棧
bool empty() { return !tos; } //判斷棧是否為空
bool full() { return tos >= length; } //判斷棧是否已滿
private:
int tos, length;
T* stack;
}; //模板不檢測出入棧是否越界,出棧操作需要用戶自行判定棧是否為空,入棧需要用戶自行判定棧是否已滿。

⑨ (C++題目)編寫一個棧類模板,

下邊都是我自己寫的,都是經過編譯的,調試用的main函數給注釋掉了
不過遺憾是沒有寫注釋,不過函數名字見名知意,希望你會滿意。

用數組作為儲存結構的順序棧
#include<iostream>
#include<assert.h>
using namespace std;
const int INCREMENT = 20;

template <class T>
class SeqStack
{
public:
SeqStack(int size = 50);
~SeqStack();
void Push(T x);
bool Pop(T& e);
bool IsEmpty();
bool IsFull();
int Length();
bool getTop(T& x);
void MakeEmpty();
void Output();
private:
T* elements;
int top;
int maxSize;
void overflowProcess();
};

template <class T>
SeqStack<T>::SeqStack(int sz)
{
top = -1;
maxSize = sz;
elements = new T[maxSize];
assert(elements != NULL);
}

template <class T>
SeqStack<T>::~SeqStack()
{
delete []elements;
}

template <class T>
void SeqStack<T>::Push(T x)
{
if(IsFull())
{
overflowProcess();
}
elements[++top] = x;
}

template <class T>
bool SeqStack<T>::Pop(T &e)
{
if(IsEmpty())
{
return false;
}
else
{
e = elements[top--];
return true;
}
}

template <class T>
bool SeqStack<T>::IsEmpty()
{
if(top == -1)
return true;
return false;
}

template <class T>
bool SeqStack<T>::IsFull()
{
if(top == maxSize -1)
{
return true;
}
return false;
}

template <class T>
bool SeqStack<T>::getTop(T &x)
{
if(IsEmpty())
{
return false;
}
x = elements[top];
}

template <class T>
int SeqStack<T>::Length()
{
return (top+1);
}

template <class T>
void SeqStack<T>::MakeEmpty()
{
top = -1;
}

template <class T>
void SeqStack<T>::overflowProcess()
{
T* newElems = new T[maxSize+INCREMENT];
if(newElems == NULL)
{
cerr << "Memory allocate error!" << endl;
exit(1);
}
for(int i=0;i<=top;i++)
{
newElems[i] = elements[i];
}
maxSize = maxSize + INCREMENT;
delete []elements;
elements = newElems;
}

template <class T>
void SeqStack<T>::Output()
{
int i = 0;
if(!IsEmpty())
{
cout << "---top---" << endl;
for(i=top;i>=0;i--)
{
cout << elements[i] << endl;
}
cout << "---base---" << endl;
}
}

/*int main()
{
SeqStack<int> s;
int i=0;
int e;
for(;i<60;i++)
{
s.Push(i*2);
}
cout << "length:" << s.Length() << endl;
s.Output();
return 0;
}*/

用鏈表作為儲存結構的鏈式棧
#include<iostream>
#include<assert.h>
using namespace std;
const int INCREMENT=20;

template <class T>
class StackNode
{
public:
StackNode(T _data,StackNode<T> *link = NULL)
{
data = _data;
next = link;
}
StackNode(StackNode<T> *link = NULL)
{
next = link;
}
StackNode<T> *next;
T data;
private:
};

template <class T>
class LinkStack
{
public:
LinkStack(){top = NULL;}
~LinkStack(){makeEmpty();}
bool isEmpty(){return (top == NULL);}
bool push(T x);
bool pop(T &x);
int getSize();
bool getTop(T &e);
void outPut();
void makeEmpty();
private:
StackNode<T>* top;
};

template <class T>
void LinkStack<T>::makeEmpty()
{
StackNode<T> *p;
while(top!=NULL)
{
p = top;
top = top->next;
delete p;
}
}

template <class T>
bool LinkStack<T>::push(T x)
{
StackNode<T> *e = new StackNode<T>(x);
if(!e)
{
cerr << "Memory allocate error!" << endl;
return false;
}
e->next = top;
top = e;
return true;
}

template <class T>
bool LinkStack<T>::pop(T &x)
{
if(!isEmpty())
{
x = top->data;
StackNode<T> *e = top;
top = top->next;
delete e;
return true;
}
return false;
}

template <class T>
bool LinkStack<T>::getTop(T &x)
{
if(!isEmpty())
{
x = top->data;
return true;
}
return false;
}

template <class T>
int LinkStack<T>::getSize()
{
StackNode<T> *p = top;
int count = 0;
while(p!=NULL)
{
count++;
p = p->next;
}
return count;
}

template <class T>
void LinkStack<T>::outPut()
{
StackNode<T> *p = top;
cout << "---top---" << endl;
while(p!=NULL)
{
cout << p->data << endl;
p = p->next;
}
cout << "---base---" << endl;
};

/*int main()
{
LinkStack<char> s;
char e;
int a = 65;
for(int i=0;i<5;i++)
{
s.push(char(a+i));
}
s.outPut();
s.makeEmpty();
s.outPut();
for(int i=0;i<6;i++)
{
s.pop(e);
cout << s.getSize()<< endl;
s.outPut();
}
return 0;
}*/

⑩ 用C寫棧的源代碼

#include <stdio.h>
#include <malloc.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR -1
#define OK 1
#define TRUE 1
#define FALSE 0

typedef int status;
typedef int ElemType;

typedef struct{
ElemType data;
ElemType *base;
ElemType *top;
int stacksize;
}Stack,*SqStack;

status InitStack(Stack &S){
//構造一個空棧
S.base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack

status GetTop(Stack &S,ElemType &e){
//若棧不空,則用e返回S的棧頂元素,並返回OK;否則返回ERROR
if(S.top==S.base) return ERROR;
e= * (S.top-1);
return OK;
}//GetTop

status Push(Stack &S,ElemType e){
//插入元素e為新的棧頂元素
if(S.top-S.base>=S.stacksize){
S.base=(ElemType *)realloc(S.base,
(S.stacksize+STACKINCREMENT) * sizeof(ElemType));
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push

status Pop(Stack &S,ElemType &e){
//若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK;否則返回ERROR
if(S.top==S.base) return ERROR;
e= * --S.top;
return OK;
}//Pop

熱點內容
塗鴉論文 發布:2021-03-31 13:04:48 瀏覽:698
手機資料庫應用 發布:2021-03-31 13:04:28 瀏覽:353
版面217 發布:2021-03-31 13:04:18 瀏覽:587
知網不查的資源 發布:2021-03-31 13:03:43 瀏覽:713
基金贖回參考 發布:2021-03-31 13:02:08 瀏覽:489
懸疑故事範文 發布:2021-03-31 13:02:07 瀏覽:87
做簡單的自我介紹範文 發布:2021-03-31 13:01:48 瀏覽:537
戰略地圖參考 發布:2021-03-31 13:01:09 瀏覽:463
收支模板 發布:2021-03-31 13:00:43 瀏覽:17
電氣學術會議 發布:2021-03-31 13:00:32 瀏覽:731