包括三個文件:stack.h,stack.cpp,main.cppios
stack.h編程
#include "stdio.h" #include <stdlib.h> #include <malloc.h> #include <string.h> #define Status int #define SElemType int #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OVERFLOW 0 #define ERROR 0 #define OK 1 // typedef struct { SElemType *base; //指向棧尾 SElemType *top; //指向棧頂 int stacksize; //記錄棧元素個數 }SqStack; // // //棧的基本操做 // //初始化棧 Status InitStack(SqStack &S); //返回1,表示成功;返回0表示不成功 //判棧滿 Status IsFull(SqStack &S); //判棧空 Status IsEmpty(SqStack &S); //如空,返回1;非空返回0 //入棧 Status Push(SqStack &S,SElemType e); //出棧 Status Pop(SqStack &S,SElemType &e); //顯示棧元素 Status StackTraverse(SqStack &S); //訪問棧頂 Status GetTop(SqStack &S,SElemType &e); //求棧長度 int StackLength(SqStack &S); //清空棧 Status ClearStack(SqStack &S); //銷燬棧 Status DestroyStack(SqStack &S);
stack.cppide
#include "stack.h" #include "stdio.h" #include <stdlib.h> #include <malloc.h> #include <iostream> using namespace std; //棧的基本操做 // ////初始化棧 Status InitStack(SqStack &S) { //構造一個空棧 S.base =(SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base) return(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } //判棧滿 Status IsFull(SqStack &S) { //若滿返回1,不然返回0 if((S.top-S.base)>= S.stacksize) //若棧滿 { //cout<<"棧滿"<<endl; return 1;} else return 0; } //判空 Status IsEmpty(SqStack &S) { //若棧空返回1,不然返回0 if(S.top==S.base) { //cout<<"棧空"<<endl; return 1; } else return 0; } //入棧 Status Push(SqStack &S,SElemType e) { //將e插入棧頂 //判滿,加空間 if( IsFull(S)==1) { S.base=(SElemType*)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(SElemType)); if(S.base==NULL) return(OVERFLOW); S.top=S.base + S.stacksize; //top指針移動到新位置 S.stacksize=S.stacksize + STACKINCREMENT; //棧空間擴容 } *S.top=e; //棧頂元素賦值 S.top++; //top指針上移 //入棧 return 0; } //出棧 Status Pop(SqStack &S,SElemType &e) { //彈出棧頂元素,並用e接收 //判空 if(IsEmpty(S)==1) return(ERROR); //彈出 S.top--; e=*S.top; //等價於e= *(--top) return OK; } //顯示棧中元素 Status StackTraverse(SqStack &S) { // cout<<"遍歷棧元素"<<endl; SElemType *p; p=S.base; while(p!=S.top) { cout<<*p<<" "; p++; } cout<<endl; cout<<"遍歷完畢!"<<endl; return 0; } //取棧頂元素 Status GetTop(SqStack &S,SElemType &e) { //若棧空返回ERROR,不然返回1 if(IsEmpty(S)==1) return ERROR; S.top--; e=*S.top; return OK; } //求長度 int StackLength(SqStack &S) { return S.top-S.base; } //清空棧 Status ClearStack(SqStack &S) { S.top=S.base; //cout<<"已清空棧"<<endl; return OK; } //銷燬棧 Status DestroyStack(SqStack &S) { free(S.base); S.top=NULL; S.base=NULL; S.stacksize=0; cout<<"已銷燬棧"<<endl; return OK; }
main.cpp函數
#include <iostream> #include "stack.h" using namespace std; int main() { /* SqStack sta; InitStack(sta); cout<<IsEmpty(sta)<<endl; Push(sta,'a'); Push(sta,'b'); Push(sta,'c'); Push(sta,'d'); cout<<"棧長度爲:"<<StackLength(sta)<<endl; StackTraverse(sta); cout<<IsEmpty(sta)<<endl; SElemType e; Pop(sta,e); cout<<"棧長度爲:"<<StackLength(sta)<<endl; cout<<"e="<<e<<endl; StackTraverse(sta); GetTop(sta,e); cout<<"e="<<e<<endl; cout<<"棧長度爲:"<<StackLength(sta)<<endl; ClearStack(sta); cout<<"棧長度爲:"<<StackLength(sta)<<endl; Push(sta,'a'); Push(sta,'b'); Push(sta,'c'); Push(sta,'d'); StackTraverse(sta); cout<<"棧長度爲:"<<StackLength(sta)<<endl; DestroyStack(sta); //cout<<"棧長度爲:"<<StackLength(sta)<<endl; */ /* //需求:將一個十進制轉換爲二進制 void conversion(); conversion(); //cout<<"棧長度爲:"<<StackLength(sta)<<endl; */ //需求:行編程程序 /* void LineEdit(); LineEdit(); */ //需求:後綴表達式求值 3 4 + 5 * 7 / char str[100]; fgets(str,100,stdin); //從標準 輸入獲取字符串 int res=0; int ReverseCal(char *); //函數聲明 res=ReverseCal(str); //函數調用 cout<<"res="<<res<<endl; system("pause"); return (0); } int Precede(char* c1,char* c2) { //大於返回1,小於返回-1,等於返回0 if(*c1=='*') { if(*c2=='+') return 1; if(*c2=='-') return 1; if(*c2=='*') return 0; if(*c2=='/') return 0; } if(*c1=='/') { if(*c2=='+') return 1; if(*c2=='-') return 1; if(*c2=='*') return 0; if(*c2=='/') return 0; } if(*c1=='+') { if(*c2=='+') return 0; if(*c2=='-') return 0; if(*c2=='*') return -1; if(*c2=='/') return -1; } if(*c1=='-') { if(*c2=='+') return 0; if(*c2=='-') return 0; if(*c2=='*') return -1; if(*c2=='/') return -1; } } char* InffixToSuffix(char *s) { //將中綴表達式轉換爲後綴表達式 SqStack OPTR; //操做符棧 SqStack OPND; //操做數棧 InitStack(OPTR); InitStack(OPND); Push(OPTR,'#'); char *p=s; while(*p!='\0') { switch(*p) { //若是不是運算符(是數字),入棧 //若是是運算符,比較符合棧的操做符,再作 } p++; } return s; } int ReverseCal(char *s) { //逆波蘭式計算器 SqStack sta; InitStack(sta); //初始化話一個棧結構 int res; int a,b; char *p=s; p=strtok(s," "); //分解字符串 Push(sta,atoi(p)); //atoi()函數將字符串轉換爲int while( (p=strtok(NULL," ")) !='\0') { switch(*p) { case '+': Pop(sta,b); Pop(sta,a); res = a+b; Push(sta,res); //將結果入棧 break; case '-': Pop(sta,b); Pop(sta,a); res = a-b; Push(sta,res); break; case '*': Pop(sta,b); Pop(sta,a); res = a*b; Push(sta,res); break; case '/': Pop(sta,b); Pop(sta,a); res = a/b; Push(sta,res); break; default: Push(sta,atoi(p)); //若是獲取數字直接入棧 } } return res; } /* void LineEdit() { //行編輯函數 cout<<"請輸入字符:"<<endl; SqStack sta; InitStack(sta); //初始化話一個棧結構 char ch,e; ch=getchar(); //cout<<ch; while(ch!=EOF && ch!='\n') { switch(ch) { case '#': Pop(sta,e); //若輸入#,回退一格 break; case '@': ClearStack(sta); //若輸入@,回退一行 break; default: Push(sta,ch); break; } ch=getchar(); } StackTraverse(sta); //遍歷棧元素 DestroyStack(sta); //銷燬棧 }//行編輯函數 */ void conversion() { //進制轉換程序 int N; cout<<"請輸入一個正整數:"<<endl; cin>>N; SqStack sta; InitStack(sta); while(N!=0) { Push(sta,N%2); //求餘 N=N/2; //整除 } //StackTraverse(sta); cout<<"對應的二進制爲:"<<endl; while(IsEmpty(sta)!=1) { SElemType e; Pop(sta,e); cout<<e<<" "; } cout<<endl; }