使用堆栈加密字符串

时间:2012-06-13 03:10:02

标签: c++ encryption stack

我上周收到了C ++课程的作业。我想你们中的一些人会发现它很有趣!我设法将大部分代码都删除了,但是我被困住了,无法解决这个问题,因为我的生活......以下是我必须在代码中加入的加密过程的指南:

  

邮件发件人输入一个四个字母的单词 CCCC ,另外还有四个字母单词,   的 XXXX 即可。

  然后,消息发送者输入要加密的消息。

  程序一次扫描一条消息,每个字符串被推入堆栈直到   要么扫描的字符在单词 CCCC 中,要么在消息的结尾处   遇到。

  当扫描的角色是 CCCC 中的其中一个角色时,打印该角色并继续   打印并弹出堆栈顶部的字符,直到堆栈为空或者   堆栈顶部的字符是 XXXX 中的字符之一。当结束了   遇到消息,打印堆栈顶部的字符并继续弹出   并从堆栈顶部打印,直到堆栈为空。   

这是一个暗示:“ GOOD ”“ LUCK ”,它“对我来说很简单 “或者作为   你的程序会说:“ OSDNOT EEM LPMIS SU

这就是实际的分配。

我遇到的麻烦是最后一点:

  

结束的时候   遇到消息,打印堆栈顶部的字符并继续弹出   并从堆栈顶部打印,直到堆栈为空。

现在这是我到目前为止的代码:

#include <string>
#include <iostream>
using namespace std;
class Stack
{
   private:
   char Chars[50];
   int top;
   public:
   int push(char);
   char pop();
   bool isEmpty();
   bool isFull();
   Stack()
   {
      top = 0;
   }
};

int main()
{
Stack theStack;
   char word1[4];
   char word2[4];
   for(int i=0; i < 4; i++){
      word1[i] = ' ';
      word2[i] = ' ';
   }
   char message[500];   
   cout << "Please enter a 4 letter word: ";
   cin >> word1;
   while(word1[4] || !word1[3])
   {
      cout << "Word must be 4 chars long. Try again: ";
      cin >> word1;
   }
   cout << "Please enter another 4 letter word: ";
   cin >> word2;
   while(word2[4] || !word2[3])
   {
      cout << "Word must be 4 chars long. Try again: ";
      cin >> word2;
   }
   cout << "Please enter the phrase to be encrypted (50 chars max): ";
   cin.ignore(1000, '\n');
   cin.getline(message,500);
   int length = strlen(message);
   int count = 0;
   char finalMsg[length];
   //scanner
   for(int i = 0; i < length; i++)
   {
      if(message[i] == word1[0] ||
         message[i] == word1[1] ||
         message[i] == word1[2] ||
         message[i] == word1[3])
      {
         finalMsg[count] = message[i];
         count++;
         if(message[i-1] != word2[0] ||
            message[i-1] != word2[1] ||
            message[i-1] != word2[2] ||
            message[i-1] != word2[3])
         {
            finalMsg[count] =  message[i-1];
            count++;
         }
      }
      else
      {
         theStack.push(message[i]);
      }
   }
   cout << finalMsg << endl;
return 0;
}

int Stack::push(char data)
{
   Chars[top] = data;
   top++;
return top;
}

char Stack::pop()
{
   char ret = Chars[top-1];
   top--;
return ret;
}

bool Stack::isEmpty()
{
   if(top <= 0)
      return true;
   else return false;
}

bool Stack::isFull()
{
   if(top >= 50)
      return true;
   else return false;
}

编译时,最终输出给了我“ OSDNOT ”,这是我教授提供的示例,所以我知道我正在走向正确的轨道..任何帮助都会很棒,我甚至不知道从哪里开始检查代码。

1 个答案:

答案 0 :(得分:3)

这是更正后的代码。您没有正确编码算法。我评论了我在代码中所做的更改。 首先,当您在扫描时遇到CCCC中存在的字符时,您没有弹出堆栈的元素。此外,在扫描结束时,您没有清空堆栈。包括cstring而不是string。正如评论中所指出的,你对word1和word2的声明是不正确的。

   char finalMsg[200];
   //scanner
   for(int i = 0; i < length; i++)
   {
      if(message[i] == word1[0] ||
         message[i] == word1[1] ||
         message[i] == word1[2] ||
         message[i] == word1[3])
      {
         finalMsg[count] = message[i];
         count++;

         //pop out elements from the stack till it is empty or an character of XXXX is encountered
         while(!theStack.isEmpty())     
         {
             char tmp=theStack.pop();
             if(tmp==word2[0] ||
                tmp==word2[1] ||
                tmp==word2[2] ||
                tmp==word2[3])
                {
                    theStack.push(tmp);
                    break;
                }
            finalMsg[count++]=tmp;
         }

      }
      else
      {
         theStack.push(message[i]);
      }
   }

  //empty the stack
   while(!theStack.isEmpty())
   {
       finalMsg[count++]=theStack.pop();
   }
   finalMsg[count++]=0;
   cout << finalMsg << endl;

PS:最好使用std :: stack和std :: string。