c語言:順序棧的應用(二) 判斷迴文數

#include<iostream>
#include<stdio.h>
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
using namespace std;
typedef struct Stack  //結構體定義
{  
int *elem;          //數據域
int top;    //順序棧棧頂
int stacksize;     //順序棧當前長度
}Stack;
//函數聲明部分
void Error(char *s);        //錯誤處理函數
void Init_Stack(Stack &l);  //初始化順序棧
void Destroy_Stack(Stack & l); //銷燬順序棧
void Push_Stack(Stack &L, int e);  //壓棧操作函數
int  Pop_Stack(Stack &L, int e);   //出棧操作函數
void Increment_Stack(Stack & l);   //增加順序棧空間函數
 void Judge_Stack(Stack &l);      //判斷是否爲迴文數
//函數實現部分
void Error(char *s)
{
cout << s << endl;
exit(1);
}

void Init_Stack(Stack &l)
{
l.elem = new int[STACK_INIT_SIZE];
if (!l.elem)
Error("內存申請失敗!");
l.top = -1;
l.stacksize = STACK_INIT_SIZE;
}

void Destroy_Stack(Stack &l)
{
delete[] l.elem;
l.top = -1;
l.stacksize = 0;
cout << "該順序棧銷燬成功!" << endl;
}

void Increment_Stack(Stack &l)
{
int *newstack = new int[l.stacksize + STACK_INCREMENT];
if (!newstack)
Error("存儲分配失敗!");
for (int i = 0; i < l.top; i++)
{
newstack[i] = l.elem[i];
}
l.elem = newstack;
delete[] l.elem;
l.stacksize += STACK_INCREMENT;
}
void Push_Stack(Stack &l, int e)
{
if (l.top == (l.stacksize - 1))
Increment_Stack(l);
l.elem[++l.top] = e;
}
int  Pop_Stack(Stack &l, int e)
{
if (l.top == -1)
Error("該順序棧爲空棧!");
  return e = l.elem[l.top--];
}

void Judge_Stack(Stack *s)           //判斷是否是迴文數函數

{
Init_Stack(*s);                   //初始化順序棧
char t[250];                      //申請內存
cout << "請輸入要判斷的數:" << endl;
cin >> t;
int i, len;
int e = 0;
char temp;
len = strlen(t);                //計算迴文數長度
for (i = 0; i <len / 2; i++)    //將回文數的一半壓棧
{
Push_Stack(*s, t[i]);
}
if (len % 2 == 1)             //判斷字符長度是奇數還是偶數,奇數加一
i++;
while (s->top>-1)
{
temp = Pop_Stack(*s, e);  //將壓入棧的元素出棧,賦給temp
if (temp != t[i])         //比較兩個字符的大小
{
cout << "該數不是迴文數!"<<endl;  //第一個不相等就直接跳出,沒必要比較後面的部分
exit(1);
}
else     //否則繼續比較大小,直到結束
i++;
}
cout << "該數是迴文數!" << endl;
}
int main()
{

Stack s;

Judge_Stack(&s);

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章